{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5212a57c-8577-46cc-8531-dd8612e043f4",
   "metadata": {},
   "source": [
    "# 分类算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "457ac0a3-4d2d-484d-b3e2-76a11f9d85d3",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "from IPython.core.interactiveshell import InteractiveShell\n",
    "InteractiveShell.ast_node_interactivity = \"all\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "fa633ae0-8bef-49cb-9c5b-6d260a333b67",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>checking</th>\n",
       "      <th>duration</th>\n",
       "      <th>history</th>\n",
       "      <th>purpose</th>\n",
       "      <th>amount</th>\n",
       "      <th>savings</th>\n",
       "      <th>employed</th>\n",
       "      <th>installp</th>\n",
       "      <th>marital</th>\n",
       "      <th>coapp</th>\n",
       "      <th>...</th>\n",
       "      <th>property</th>\n",
       "      <th>age</th>\n",
       "      <th>other</th>\n",
       "      <th>housing</th>\n",
       "      <th>existcr</th>\n",
       "      <th>job</th>\n",
       "      <th>depends</th>\n",
       "      <th>telephon</th>\n",
       "      <th>foreign</th>\n",
       "      <th>good_bad</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>1169</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>67</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>48</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>5951</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>22</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>bad</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4</td>\n",
       "      <td>12</td>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "      <td>2096</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>49</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>42</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>7882</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>45</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>24</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>4870</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>53</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>bad</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 21 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   checking  duration  history purpose  amount  savings  employed  installp  \\\n",
       "0         1         6        4       3    1169        5         5         4   \n",
       "1         2        48        2       3    5951        1         3         2   \n",
       "2         4        12        4       6    2096        1         4         2   \n",
       "3         1        42        2       2    7882        1         4         2   \n",
       "4         1        24        3       0    4870        1         3         3   \n",
       "\n",
       "   marital  coapp  ...  property  age  other  housing  existcr  job  depends  \\\n",
       "0        3      1  ...         1   67      3        2        2    3        1   \n",
       "1        2      1  ...         1   22      3        2        1    3        1   \n",
       "2        3      1  ...         1   49      3        2        1    2        2   \n",
       "3        3      3  ...         2   45      3        3        1    3        2   \n",
       "4        3      1  ...         4   53      3        3        2    3        2   \n",
       "\n",
       "   telephon  foreign  good_bad  \n",
       "0         2        1      good  \n",
       "1         1        1       bad  \n",
       "2         1        1      good  \n",
       "3         1        1      good  \n",
       "4         1        1       bad  \n",
       "\n",
       "[5 rows x 21 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 利用pandas导入csv数据，查看前5行导入结果看是否正常\n",
    "import pandas as pd\n",
    "credit_df = pd.read_csv(\"D:/work/machine-learning/datasets/credit/credit.csv\")\n",
    "credit_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "5d9271c8-fcc2-40a7-9ed2-603ba750c7a9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>checking</th>\n",
       "      <th>duration</th>\n",
       "      <th>history</th>\n",
       "      <th>purpose</th>\n",
       "      <th>amount</th>\n",
       "      <th>savings</th>\n",
       "      <th>employed</th>\n",
       "      <th>installp</th>\n",
       "      <th>marital</th>\n",
       "      <th>coapp</th>\n",
       "      <th>...</th>\n",
       "      <th>property</th>\n",
       "      <th>age</th>\n",
       "      <th>other</th>\n",
       "      <th>housing</th>\n",
       "      <th>existcr</th>\n",
       "      <th>job</th>\n",
       "      <th>depends</th>\n",
       "      <th>telephon</th>\n",
       "      <th>foreign</th>\n",
       "      <th>good_bad</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>1169</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>67</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>48</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>5951</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>22</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>bad</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4</td>\n",
       "      <td>12</td>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "      <td>2096</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>49</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>42</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>7882</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>45</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>24</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>4870</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>53</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>bad</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>995</th>\n",
       "      <td>4</td>\n",
       "      <td>12</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1736</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>31</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>996</th>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3857</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>40</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>997</th>\n",
       "      <td>4</td>\n",
       "      <td>12</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>804</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>38</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>998</th>\n",
       "      <td>1</td>\n",
       "      <td>45</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>1845</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>23</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>bad</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>999</th>\n",
       "      <td>2</td>\n",
       "      <td>45</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>4576</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>27</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1000 rows × 21 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     checking  duration  history purpose  amount  savings  employed  installp  \\\n",
       "0           1         6        4       3    1169        5         5         4   \n",
       "1           2        48        2       3    5951        1         3         2   \n",
       "2           4        12        4       6    2096        1         4         2   \n",
       "3           1        42        2       2    7882        1         4         2   \n",
       "4           1        24        3       0    4870        1         3         3   \n",
       "..        ...       ...      ...     ...     ...      ...       ...       ...   \n",
       "995         4        12        2       2    1736        1         4         3   \n",
       "996         1        30        2       1    3857        1         3         4   \n",
       "997         4        12        2       3     804        1         5         4   \n",
       "998         1        45        2       3    1845        1         3         4   \n",
       "999         2        45        4       1    4576        2         1         3   \n",
       "\n",
       "     marital  coapp  ...  property  age  other  housing  existcr  job  \\\n",
       "0          3      1  ...         1   67      3        2        2    3   \n",
       "1          2      1  ...         1   22      3        2        1    3   \n",
       "2          3      1  ...         1   49      3        2        1    2   \n",
       "3          3      3  ...         2   45      3        3        1    3   \n",
       "4          3      1  ...         4   53      3        3        2    3   \n",
       "..       ...    ...  ...       ...  ...    ...      ...      ...  ...   \n",
       "995        2      1  ...         1   31      3        2        1    2   \n",
       "996        1      1  ...         2   40      3        2        1    4   \n",
       "997        3      1  ...         3   38      3        2        1    3   \n",
       "998        3      1  ...         4   23      3        3        1    3   \n",
       "999        3      1  ...         3   27      3        2        1    3   \n",
       "\n",
       "     depends  telephon  foreign  good_bad  \n",
       "0          1         2        1      good  \n",
       "1          1         1        1       bad  \n",
       "2          2         1        1      good  \n",
       "3          2         1        1      good  \n",
       "4          2         1        1       bad  \n",
       "..       ...       ...      ...       ...  \n",
       "995        1         1        1      good  \n",
       "996        1         2        1      good  \n",
       "997        1         1        1      good  \n",
       "998        1         2        1       bad  \n",
       "999        1         1        1      good  \n",
       "\n",
       "[1000 rows x 21 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "1445bfc4-f203-44d5-b16c-1b1372f92704",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1000 entries, 0 to 999\n",
      "Data columns (total 21 columns):\n",
      " #   Column    Non-Null Count  Dtype \n",
      "---  ------    --------------  ----- \n",
      " 0   checking  1000 non-null   int64 \n",
      " 1   duration  1000 non-null   int64 \n",
      " 2   history   1000 non-null   int64 \n",
      " 3   purpose   1000 non-null   object\n",
      " 4   amount    1000 non-null   int64 \n",
      " 5   savings   1000 non-null   int64 \n",
      " 6   employed  1000 non-null   int64 \n",
      " 7   installp  1000 non-null   int64 \n",
      " 8   marital   1000 non-null   int64 \n",
      " 9   coapp     1000 non-null   int64 \n",
      " 10  resident  1000 non-null   int64 \n",
      " 11  property  1000 non-null   int64 \n",
      " 12  age       1000 non-null   int64 \n",
      " 13  other     1000 non-null   int64 \n",
      " 14  housing   1000 non-null   int64 \n",
      " 15  existcr   1000 non-null   int64 \n",
      " 16  job       1000 non-null   int64 \n",
      " 17  depends   1000 non-null   int64 \n",
      " 18  telephon  1000 non-null   int64 \n",
      " 19  foreign   1000 non-null   int64 \n",
      " 20  good_bad  1000 non-null   object\n",
      "dtypes: int64(19), object(2)\n",
      "memory usage: 164.2+ KB\n"
     ]
    }
   ],
   "source": [
    "credit_df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "8c4d8292-4526-495c-bfa2-4503ecb05be4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>checking</th>\n",
       "      <th>duration</th>\n",
       "      <th>history</th>\n",
       "      <th>amount</th>\n",
       "      <th>savings</th>\n",
       "      <th>employed</th>\n",
       "      <th>installp</th>\n",
       "      <th>marital</th>\n",
       "      <th>coapp</th>\n",
       "      <th>resident</th>\n",
       "      <th>property</th>\n",
       "      <th>age</th>\n",
       "      <th>other</th>\n",
       "      <th>housing</th>\n",
       "      <th>existcr</th>\n",
       "      <th>job</th>\n",
       "      <th>depends</th>\n",
       "      <th>telephon</th>\n",
       "      <th>foreign</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.00000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.00000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2.577000</td>\n",
       "      <td>20.903000</td>\n",
       "      <td>2.54500</td>\n",
       "      <td>3271.258000</td>\n",
       "      <td>2.105000</td>\n",
       "      <td>3.384000</td>\n",
       "      <td>2.973000</td>\n",
       "      <td>2.68200</td>\n",
       "      <td>1.145000</td>\n",
       "      <td>2.845000</td>\n",
       "      <td>2.358000</td>\n",
       "      <td>35.546000</td>\n",
       "      <td>2.675000</td>\n",
       "      <td>1.929000</td>\n",
       "      <td>1.407000</td>\n",
       "      <td>2.904000</td>\n",
       "      <td>1.155000</td>\n",
       "      <td>1.404000</td>\n",
       "      <td>1.037000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>1.257638</td>\n",
       "      <td>12.058814</td>\n",
       "      <td>1.08312</td>\n",
       "      <td>2822.736876</td>\n",
       "      <td>1.580023</td>\n",
       "      <td>1.208306</td>\n",
       "      <td>1.118715</td>\n",
       "      <td>0.70808</td>\n",
       "      <td>0.477706</td>\n",
       "      <td>1.103718</td>\n",
       "      <td>1.050209</td>\n",
       "      <td>11.375469</td>\n",
       "      <td>0.705601</td>\n",
       "      <td>0.531264</td>\n",
       "      <td>0.577654</td>\n",
       "      <td>0.653614</td>\n",
       "      <td>0.362086</td>\n",
       "      <td>0.490943</td>\n",
       "      <td>0.188856</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>250.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>19.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>12.000000</td>\n",
       "      <td>2.00000</td>\n",
       "      <td>1365.500000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>27.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>18.000000</td>\n",
       "      <td>2.00000</td>\n",
       "      <td>2319.500000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>3.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>33.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>4.000000</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>4.00000</td>\n",
       "      <td>3972.250000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>3.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>42.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>4.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>4.00000</td>\n",
       "      <td>18424.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.00000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>75.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          checking     duration     history        amount      savings  \\\n",
       "count  1000.000000  1000.000000  1000.00000   1000.000000  1000.000000   \n",
       "mean      2.577000    20.903000     2.54500   3271.258000     2.105000   \n",
       "std       1.257638    12.058814     1.08312   2822.736876     1.580023   \n",
       "min       1.000000     4.000000     0.00000    250.000000     1.000000   \n",
       "25%       1.000000    12.000000     2.00000   1365.500000     1.000000   \n",
       "50%       2.000000    18.000000     2.00000   2319.500000     1.000000   \n",
       "75%       4.000000    24.000000     4.00000   3972.250000     3.000000   \n",
       "max       4.000000    72.000000     4.00000  18424.000000     5.000000   \n",
       "\n",
       "          employed     installp     marital        coapp     resident  \\\n",
       "count  1000.000000  1000.000000  1000.00000  1000.000000  1000.000000   \n",
       "mean      3.384000     2.973000     2.68200     1.145000     2.845000   \n",
       "std       1.208306     1.118715     0.70808     0.477706     1.103718   \n",
       "min       1.000000     1.000000     1.00000     1.000000     1.000000   \n",
       "25%       3.000000     2.000000     2.00000     1.000000     2.000000   \n",
       "50%       3.000000     3.000000     3.00000     1.000000     3.000000   \n",
       "75%       5.000000     4.000000     3.00000     1.000000     4.000000   \n",
       "max       5.000000     4.000000     4.00000     3.000000     4.000000   \n",
       "\n",
       "          property          age        other      housing      existcr  \\\n",
       "count  1000.000000  1000.000000  1000.000000  1000.000000  1000.000000   \n",
       "mean      2.358000    35.546000     2.675000     1.929000     1.407000   \n",
       "std       1.050209    11.375469     0.705601     0.531264     0.577654   \n",
       "min       1.000000    19.000000     1.000000     1.000000     1.000000   \n",
       "25%       1.000000    27.000000     3.000000     2.000000     1.000000   \n",
       "50%       2.000000    33.000000     3.000000     2.000000     1.000000   \n",
       "75%       3.000000    42.000000     3.000000     2.000000     2.000000   \n",
       "max       4.000000    75.000000     3.000000     3.000000     4.000000   \n",
       "\n",
       "               job      depends     telephon      foreign  \n",
       "count  1000.000000  1000.000000  1000.000000  1000.000000  \n",
       "mean      2.904000     1.155000     1.404000     1.037000  \n",
       "std       0.653614     0.362086     0.490943     0.188856  \n",
       "min       1.000000     1.000000     1.000000     1.000000  \n",
       "25%       3.000000     1.000000     1.000000     1.000000  \n",
       "50%       3.000000     1.000000     1.000000     1.000000  \n",
       "75%       3.000000     1.000000     2.000000     1.000000  \n",
       "max       4.000000     2.000000     2.000000     2.000000  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "25ac26d0-808f-493b-9ac6-9ea78e80090f",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "checking    0\n",
       "duration    0\n",
       "history     0\n",
       "purpose     0\n",
       "amount      0\n",
       "savings     0\n",
       "employed    0\n",
       "installp    0\n",
       "marital     0\n",
       "coapp       0\n",
       "resident    0\n",
       "property    0\n",
       "age         0\n",
       "other       0\n",
       "housing     0\n",
       "existcr     0\n",
       "job         0\n",
       "depends     0\n",
       "telephon    0\n",
       "foreign     0\n",
       "good_bad    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_df.isnull().sum()     #检查空值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f9cd0eb2-9231-45ea-97c7-37dffa699a53",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>checking</th>\n",
       "      <th>duration</th>\n",
       "      <th>history</th>\n",
       "      <th>purpose</th>\n",
       "      <th>amount</th>\n",
       "      <th>savings</th>\n",
       "      <th>employed</th>\n",
       "      <th>installp</th>\n",
       "      <th>marital</th>\n",
       "      <th>coapp</th>\n",
       "      <th>...</th>\n",
       "      <th>property</th>\n",
       "      <th>age</th>\n",
       "      <th>other</th>\n",
       "      <th>housing</th>\n",
       "      <th>existcr</th>\n",
       "      <th>job</th>\n",
       "      <th>depends</th>\n",
       "      <th>telephon</th>\n",
       "      <th>foreign</th>\n",
       "      <th>good_bad</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>0 rows × 21 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [checking, duration, history, purpose, amount, savings, employed, installp, marital, coapp, resident, property, age, other, housing, existcr, job, depends, telephon, foreign, good_bad]\n",
       "Index: []\n",
       "\n",
       "[0 rows x 21 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_df[credit_df.duplicated( )]     #重复数据检查"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "15751635-a71e-4723-adfe-ee492f5b51f9",
   "metadata": {},
   "source": [
    "# 数据的检查\n",
    "* .info()\n",
    "* .describe\n",
    "* .isnull()\n",
    "* .duplicated()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "66965f5f-8293-4042-b054-8c7119b61398",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0      1\n",
       "1      2\n",
       "2      4\n",
       "3      1\n",
       "4      1\n",
       "      ..\n",
       "995    4\n",
       "996    1\n",
       "997    4\n",
       "998    1\n",
       "999    2\n",
       "Name: checking, Length: 1000, dtype: int64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_df.checking"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "bd6aefeb-1d82-45d0-bfdb-113fc2e768c3",
   "metadata": {},
   "outputs": [],
   "source": [
    "checking = pd.get_dummies(credit_df.checking,prefix='checking')\n",
    "history = pd.get_dummies(credit_df.history,prefix='history')\n",
    "purpose = pd.get_dummies(credit_df.purpose,prefix='purpose')\n",
    "savings = pd.get_dummies(credit_df.savings,prefix='savings')\n",
    "employed = pd.get_dummies(credit_df.employed,prefix='employed')\n",
    "installp = pd.get_dummies(credit_df.installp,prefix='installp')\n",
    "marital = pd.get_dummies(credit_df.marital,prefix='marital')\n",
    "coapp = pd.get_dummies(credit_df.coapp,prefix='coapp')\n",
    "installp = pd.get_dummies(credit_df.installp,prefix='installp')\n",
    "resident = pd.get_dummies(credit_df.resident,prefix='resident')\n",
    "property = pd.get_dummies(credit_df.property,prefix='property')\n",
    "housing = pd.get_dummies(credit_df.housing,prefix='housing')\n",
    "existcr = pd.get_dummies(credit_df.existcr,prefix='existcr')\n",
    "job = pd.get_dummies(credit_df.job,prefix='job')\n",
    "depends = pd.get_dummies(credit_df.depends,prefix='depends')\n",
    "telephon = pd.get_dummies(credit_df.telephon,prefix='telephon')\n",
    "foreign = pd.get_dummies(credit_df.foreign,prefix='foreign')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "3e70e443-2bac-4691-b9ea-78fc66ccc3df",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>checking_1</th>\n",
       "      <th>checking_2</th>\n",
       "      <th>checking_3</th>\n",
       "      <th>checking_4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>995</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>996</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>997</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>998</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>999</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1000 rows × 4 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     checking_1  checking_2  checking_3  checking_4\n",
       "0          True       False       False       False\n",
       "1         False        True       False       False\n",
       "2         False       False       False        True\n",
       "3          True       False       False       False\n",
       "4          True       False       False       False\n",
       "..          ...         ...         ...         ...\n",
       "995       False       False       False        True\n",
       "996        True       False       False       False\n",
       "997       False       False       False        True\n",
       "998        True       False       False       False\n",
       "999       False        True       False       False\n",
       "\n",
       "[1000 rows x 4 columns]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "checking"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "1208fedc-138f-46ba-bcb2-8d82931e9531",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>duration</th>\n",
       "      <th>amount</th>\n",
       "      <th>age</th>\n",
       "      <th>checking_1</th>\n",
       "      <th>checking_2</th>\n",
       "      <th>checking_3</th>\n",
       "      <th>checking_4</th>\n",
       "      <th>history_0</th>\n",
       "      <th>history_1</th>\n",
       "      <th>history_2</th>\n",
       "      <th>...</th>\n",
       "      <th>job_1</th>\n",
       "      <th>job_2</th>\n",
       "      <th>job_3</th>\n",
       "      <th>job_4</th>\n",
       "      <th>depends_1</th>\n",
       "      <th>depends_2</th>\n",
       "      <th>telephon_1</th>\n",
       "      <th>telephon_2</th>\n",
       "      <th>foreign_1</th>\n",
       "      <th>foreign_2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>1169</td>\n",
       "      <td>67</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>48</td>\n",
       "      <td>5951</td>\n",
       "      <td>22</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>12</td>\n",
       "      <td>2096</td>\n",
       "      <td>49</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>42</td>\n",
       "      <td>7882</td>\n",
       "      <td>45</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>24</td>\n",
       "      <td>4870</td>\n",
       "      <td>53</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 72 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   duration  amount  age  checking_1  checking_2  checking_3  checking_4  \\\n",
       "0         6    1169   67        True       False       False       False   \n",
       "1        48    5951   22       False        True       False       False   \n",
       "2        12    2096   49       False       False       False        True   \n",
       "3        42    7882   45        True       False       False       False   \n",
       "4        24    4870   53        True       False       False       False   \n",
       "\n",
       "   history_0  history_1  history_2  ...  job_1  job_2  job_3  job_4  \\\n",
       "0      False      False      False  ...  False  False   True  False   \n",
       "1      False      False       True  ...  False  False   True  False   \n",
       "2      False      False      False  ...  False   True  False  False   \n",
       "3      False      False       True  ...  False  False   True  False   \n",
       "4      False      False      False  ...  False  False   True  False   \n",
       "\n",
       "   depends_1  depends_2  telephon_1  telephon_2  foreign_1  foreign_2  \n",
       "0       True      False       False        True       True      False  \n",
       "1       True      False        True       False       True      False  \n",
       "2      False       True        True       False       True      False  \n",
       "3      False       True        True       False       True      False  \n",
       "4      False       True        True       False       True      False  \n",
       "\n",
       "[5 rows x 72 columns]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 利用concat()函数把转换后的数据对象全部合并在一起变成新的数据对象，命名为trainData_X\n",
    "trainData_X = pd.concat([credit_df.duration, credit_df.amount, credit_df.age, checking, history, purpose, savings, employed, installp, marital, coapp, installp, resident, property, housing, existcr, job, depends, telephon, foreign], axis=1)\n",
    "trainData_X.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "0d2badc8-54a5-4400-a938-cf34c5acaae4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构造目标变量y的数据对象\n",
    "# 当前的目标变量good_bad的取值是'good'和'bad'，一般我们习惯把二分类的类别值编码为0和1，1一般表示类别比较少的那一类，他们往往是我们感兴趣的\n",
    "credit_df['target'] = 0\n",
    "credit_df.loc[(credit_df.good_bad == 'bad'), 'target'] = 1\n",
    "\n",
    "trainData_y = credit_df['target'] \n",
    "#trainData_y.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "850ca1bb-f644-4b2b-a2d2-c38560a469c2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拆分训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(trainData_X, trainData_y, test_size=0.3, random_state=123456)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "0a34a9ae-5424-40ca-b6f3-7a0346c237d7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(700, 72) (300, 72)\n"
     ]
    }
   ],
   "source": [
    "# 查看一下拆分后的train和test的shape，确认拆分正确\n",
    "print(X_train.shape,X_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "5e36091e-f18f-4244-8b00-ba27f77d7b10",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 0 Axes>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "(-6.0, 6.0, 0.0, 1.0)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x17b58dad4c0>]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAGiCAYAAADNzj2mAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA6XklEQVR4nO3deVxVZeLH8S+bCK6JipobWY6WoxWUqZk5paWN1VRqWZqOWqS5UaloizqOlHvmXi5jaWOljWaUMb9MTds0W0bbNItSFHdcAeH8/ngCIlC5cOG5y+f9ep3XPfdwL3x9Ivv23HOeE+A4jiMAAAAPEmg7AAAAwB9RUAAAgMehoAAAAI9DQQEAAB6HggIAADwOBQUAAHgcCgoAAPA4FBQAAOBxKCgAAMDjUFAAAIDHcbmgbNiwQV26dFGdOnUUEBCg//znPxd8z/r16xUdHa3y5cvrkksu0dy5c4uTFQAA+AmXC8rJkyfVokULzZw5s0iv3717tzp37qy2bdtq27ZtGjVqlAYPHqwVK1a4HBYAAPiHgJLcLDAgIEBvvvmm7rzzznO+ZsSIEVq9erW++eab3GOxsbH68ssv9dFHHxX3RwMAAB8WXNo/4KOPPlLHjh3zHbvlllu0YMECZWZmKiQkpMB70tPTlZ6envs8Oztbhw8fVkREhAICAko7MgAAcAPHcXT8+HHVqVNHgYGufWhT6gVl3759ioyMzHcsMjJSZ8+e1cGDB1W7du0C70lISNDYsWNLOxoAACgDv/zyi+rWrevSe0q9oEgqMOuR86nSuWZD4uPjFRcXl/v82LFjql+/vr7//ntVq1at9IL6gczMTK1bt07t27cvdPYKRcM4ug9j6T6MpXvYGMfsbCktTTp8WDp8OECHDklHjkhHjwboyBHp2DGzf+yYftsClJZm3nPyZNl8shAU5Cg0VPm2kJCcfSd3/4orHP3jH9mSpMOHD6tx48aqVKmSyz+v1AtKrVq1tG/fvnzHUlNTFRwcrIiIiELfExoaqtDQ0ALHq1Wrds73oGgyMzMVHh6uiIgI/gIrAcbRfRhL92Es3cNd4+g4pmTs3Wu2lBRp/35p3z6z7d8vHTiQt2VllSx3aKhUqZJUubJ5rFRJqlgxb6tQIe8xZwsPz9vCwgpu5cubx9BQKbgEjaE4p2eUekFp1aqV3nrrrXzH3nvvPcXExPAvEADAa504If38s/TTT2b75Rez/fqredy7V/rd6ZRFUrGiVL26FBFhtmrV8raqVaWLLjKPVatKVaqYx8qVzVbI/9d7NZcLyokTJ7Rz587c57t379YXX3yhatWqqX79+oqPj9eePXu0ZMkSSeaKnZkzZyouLk79+/fXRx99pAULFujVV191358CAAA3cxwzs/H992bbtStv271bOniwaN+nenWpdm2z1aolRUaax5o187YaNczrfK1klITLBWXLli1q37597vOcc0UefPBBLV68WCkpKUpOTs79elRUlBITEzVs2DDNmjVLderU0YwZM3T33Xe7IT4AACWTnS0lJ0s7dpjt66+D9MknbdWnT7COHDn/e6tWlRo2lBo0kOrXl+rVM1vdumarXZvSUVwuF5Qbb7xR51s6ZfHixQWOtWvXTp9//rmrPwoAALc6fVr68sv829dfS8eP//5VgZLyLsioX19q3Fhq1Cj/1rCh+ZgFpaNMruIBAKCsnT0rffWV9PHH0pYt0tat0vbthZ+MGhIi/elP0uWXS02aZOn06c/VvfuVato0ROHhZZ8dFBQAgI84dkzatEnauFH66CPps8+kU6cKvq5mTemqq6QWLfK2xo1NSZGkzMxsJSbuVfPmV4prOeyhoAAAvNLx49L69dL//Z+0YYP0xRfmfJLfq1JFatlSuvZaKTpaiomRLr5YYlFyz0dBAQB4hawsMyvy7rvSf/8rffKJ+Rjn9y69VGrbVmrTRmrVSmrSRHJxhXV4CAoKAMBjHTtmCsnbb0vvvFPw0t5LL5Vuuklq394Ukzp17OSE+1FQAAAe5cABadUqaeVKM1OSmZn3tcqVpY4dpVtukW6+2VxJA99EQQEAWHf0qCkky5ZJ69blP5ekSRPpr3+VbrvNfHTDiav+gYICALAiI0Nas0Z65RXzEU5GRt7Xrr5auususzVtai8j7KGgAADK1I4d0oIF0ssvm49zclxxhXT//dK990pRUfbywTNQUAAApS49XXrjDWnWLLNGSY7ataVevUwx+fOf7eWD56GgAABKza+/SvPmSfPnS6mp5lhwsDmnpG9f6dZbzXPgj/i1AAC43VdfSZMmSa++mre0/MUXS488YopJrVp288HzUVAAAG7hOGZl14kTzZolOW64QRo0SLrjDq7AQdFRUAAAJbZunfT009KHH5rngYHSPfdITzxhlpcH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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 了解一下sigmoid曲线\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline \n",
    "import numpy as np\n",
    "\n",
    "plt.figure()\n",
    "plt.axis([-6,6,0,1])\n",
    "plt.grid(True)\n",
    "X=np.arange(-6,6,0.1)\n",
    "\n",
    "#sigmoid函数\n",
    "y=1/(1+np.e**(-X))\n",
    "\n",
    "plt.plot(X,y,'b-')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "5bb049d7-cebe-4eeb-b40d-e0a6ed3c97c5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LogisticRegression(solver=&#x27;liblinear&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;LogisticRegression<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>LogisticRegression(solver=&#x27;liblinear&#x27;)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "LogisticRegression(solver='liblinear')"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "# 通过LogisticRegression类定义一个逻辑回归模型名字叫lr\n",
    "lr = LogisticRegression(solver='liblinear')\n",
    "\n",
    "# 对lr模型进行训练(fit)\n",
    "lr.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "2f3003ee-bb16-4395-b61a-d2d966cf4cd7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.82      0.85      0.83       210\n",
      "           1       0.61      0.56      0.58        90\n",
      "\n",
      "    accuracy                           0.76       300\n",
      "   macro avg       0.71      0.70      0.71       300\n",
      "weighted avg       0.75      0.76      0.76       300\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = lr.predict(X_test)\n",
    "y_test_prob = lr.predict_proba(X_test)\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "dd8cfdb7-f34c-42a2-921a-e7747664da92",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[178  32]\n",
      " [ 40  50]]\n"
     ]
    }
   ],
   "source": [
    "#误分类矩阵\n",
    "print(confusion_matrix(y_test,y_test_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cf7b167a-2ef8-41b1-bd88-77bdea9bef8a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "2549609d-9fa8-44f7-97e0-e0db0db5fd81",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-0.29172737]\n",
      "[[ 2.83467606e-02  1.11549829e-04 -1.32182504e-02  7.30297670e-01\n",
      "   1.89700432e-01 -1.48416015e-01 -1.06330946e+00  5.52942930e-01\n",
      "   7.00969585e-01 -1.95922770e-01 -5.08300411e-01 -8.41416703e-01\n",
      "   5.78989630e-01 -1.02765701e+00 -5.19006180e-01 -3.10160488e-01\n",
      "   8.35556256e-02  4.42869197e-01  9.71428929e-01 -4.01715201e-02\n",
      "  -2.75690249e-01 -1.95885304e-01  4.20836315e-01  2.60894830e-01\n",
      "  -1.99045791e-02 -4.51044116e-01 -5.02509818e-01  3.99995365e-03\n",
      "   1.67238873e-01 -6.34854317e-03 -4.30204398e-01 -2.64132546e-02\n",
      "  -3.24741351e-01 -1.61721484e-01  9.33196308e-02  1.01415835e-01\n",
      "   2.42409353e-01  4.83734421e-02 -4.54944507e-01 -1.27565657e-01\n",
      "  -7.68571154e-02  3.92534040e-01 -6.07404294e-01 -3.24741351e-01\n",
      "  -1.61721484e-01  9.33196308e-02  1.01415835e-01 -4.82690647e-01\n",
      "   3.70445186e-01 -1.35058414e-02 -1.65976066e-01 -2.38577081e-01\n",
      "   2.64546621e-02 -4.20531210e-02 -3.75518288e-02  2.21796123e-01\n",
      "  -3.75505910e-01 -1.38017582e-01 -3.65477255e-01 -7.63379602e-03\n",
      "  -1.44430333e-01  2.25814015e-01 -4.82101946e-02 -1.39160654e-01\n",
      "   6.11582909e-02 -1.65514811e-01 -3.55524341e-01  6.37969727e-02\n",
      "   2.23312441e-02 -3.14058613e-01  5.70467757e-01 -8.62195126e-01]]\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>coef</th>\n",
       "      <th>columns</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>[0.028346760642488842]</td>\n",
       "      <td>duration</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>[0.00011154982882002314]</td>\n",
       "      <td>amount</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>[-0.013218250387654137]</td>\n",
       "      <td>age</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>[0.7302976702791446]</td>\n",
       "      <td>checking_1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>[0.18970043225039326]</td>\n",
       "      <td>checking_2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>67</th>\n",
       "      <td>[0.06379697271423913]</td>\n",
       "      <td>depends_2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>68</th>\n",
       "      <td>[0.022331244067428296]</td>\n",
       "      <td>telephon_1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>69</th>\n",
       "      <td>[-0.31405861268393526]</td>\n",
       "      <td>telephon_2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>70</th>\n",
       "      <td>[0.5704677571106963]</td>\n",
       "      <td>foreign_1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>71</th>\n",
       "      <td>[-0.8621951257271937]</td>\n",
       "      <td>foreign_2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>72 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                        coef     columns\n",
       "0     [0.028346760642488842]    duration\n",
       "1   [0.00011154982882002314]      amount\n",
       "2    [-0.013218250387654137]         age\n",
       "3       [0.7302976702791446]  checking_1\n",
       "4      [0.18970043225039326]  checking_2\n",
       "..                       ...         ...\n",
       "67     [0.06379697271423913]   depends_2\n",
       "68    [0.022331244067428296]  telephon_1\n",
       "69    [-0.31405861268393526]  telephon_2\n",
       "70      [0.5704677571106963]   foreign_1\n",
       "71     [-0.8621951257271937]   foreign_2\n",
       "\n",
       "[72 rows x 2 columns]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看模型结果\n",
    "print(lr.intercept_ )\n",
    "print(lr.coef_)\n",
    "\n",
    "# 把变量名称和系数对应在一起方便查看\n",
    "pd.DataFrame(list(zip(np.transpose(lr.coef_), X_train.columns)), columns=['coef', 'columns'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "052ae76d-db28-4d51-ac1a-96412169581f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-2 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-2 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-2 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-2 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-2 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=LogisticRegression(solver=&#x27;liblinear&#x27;),\n",
       "             param_grid={&#x27;C&#x27;: (0.01, 0.1, 1, 15), &#x27;penalty&#x27;: (&#x27;l1&#x27;, &#x27;l2&#x27;)},\n",
       "             scoring=&#x27;accuracy&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" ><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5, estimator=LogisticRegression(solver=&#x27;liblinear&#x27;),\n",
       "             param_grid={&#x27;C&#x27;: (0.01, 0.1, 1, 15), &#x27;penalty&#x27;: (&#x27;l1&#x27;, &#x27;l2&#x27;)},\n",
       "             scoring=&#x27;accuracy&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">estimator: LogisticRegression</label><div class=\"sk-toggleable__content fitted\"><pre>LogisticRegression(solver=&#x27;liblinear&#x27;)</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" ><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;LogisticRegression<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>LogisticRegression(solver=&#x27;liblinear&#x27;)</pre></div> </div></div></div></div></div></div></div></div></div>"
      ],
      "text/plain": [
       "GridSearchCV(cv=5, estimator=LogisticRegression(solver='liblinear'),\n",
       "             param_grid={'C': (0.01, 0.1, 1, 15), 'penalty': ('l1', 'l2')},\n",
       "             scoring='accuracy')"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LogisticRegression(C=1, solver='liblinear')\n",
      "0.7628571428571428\n",
      "{'C': 1, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "# grid search调参\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "parameters = {\n",
    "    'penalty': ('l1', 'l2'),\n",
    "    'C': (0.01, 0.1, 1, 15),\n",
    "}\n",
    "\n",
    "lr = LogisticRegression(solver='liblinear')\n",
    "lr_search = GridSearchCV(lr, parameters, scoring='accuracy', cv=5)\n",
    "lr_search.fit(X_train, y_train)\n",
    "\n",
    "#查看最佳结果\n",
    "print(lr_search.best_estimator_)\n",
    "print(lr_search.best_score_)\n",
    "print(lr_search.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "42f84f92-a8ec-4a62-a052-5586ad41f331",
   "metadata": {},
   "source": [
    "# 作业"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "e9a088c6-2b9e-4d4a-a1af-9beba520667a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "from IPython.core.interactiveshell import InteractiveShell\n",
    "InteractiveShell.ast_node_interactivity = \"all\" "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "c2dfbc1b-32da-4c22-a813-b32b0aaf56ea",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>22</th>\n",
       "      <th>23</th>\n",
       "      <th>24</th>\n",
       "      <th>25</th>\n",
       "      <th>26</th>\n",
       "      <th>27</th>\n",
       "      <th>28</th>\n",
       "      <th>29</th>\n",
       "      <th>30</th>\n",
       "      <th>31</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>842302</td>\n",
       "      <td>M</td>\n",
       "      <td>17.99</td>\n",
       "      <td>10.38</td>\n",
       "      <td>122.80</td>\n",
       "      <td>1001.0</td>\n",
       "      <td>0.11840</td>\n",
       "      <td>0.27760</td>\n",
       "      <td>0.3001</td>\n",
       "      <td>0.14710</td>\n",
       "      <td>...</td>\n",
       "      <td>25.38</td>\n",
       "      <td>17.33</td>\n",
       "      <td>184.60</td>\n",
       "      <td>2019.0</td>\n",
       "      <td>0.1622</td>\n",
       "      <td>0.6656</td>\n",
       "      <td>0.7119</td>\n",
       "      <td>0.2654</td>\n",
       "      <td>0.4601</td>\n",
       "      <td>0.11890</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>842517</td>\n",
       "      <td>M</td>\n",
       "      <td>20.57</td>\n",
       "      <td>17.77</td>\n",
       "      <td>132.90</td>\n",
       "      <td>1326.0</td>\n",
       "      <td>0.08474</td>\n",
       "      <td>0.07864</td>\n",
       "      <td>0.0869</td>\n",
       "      <td>0.07017</td>\n",
       "      <td>...</td>\n",
       "      <td>24.99</td>\n",
       "      <td>23.41</td>\n",
       "      <td>158.80</td>\n",
       "      <td>1956.0</td>\n",
       "      <td>0.1238</td>\n",
       "      <td>0.1866</td>\n",
       "      <td>0.2416</td>\n",
       "      <td>0.1860</td>\n",
       "      <td>0.2750</td>\n",
       "      <td>0.08902</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>84300903</td>\n",
       "      <td>M</td>\n",
       "      <td>19.69</td>\n",
       "      <td>21.25</td>\n",
       "      <td>130.00</td>\n",
       "      <td>1203.0</td>\n",
       "      <td>0.10960</td>\n",
       "      <td>0.15990</td>\n",
       "      <td>0.1974</td>\n",
       "      <td>0.12790</td>\n",
       "      <td>...</td>\n",
       "      <td>23.57</td>\n",
       "      <td>25.53</td>\n",
       "      <td>152.50</td>\n",
       "      <td>1709.0</td>\n",
       "      <td>0.1444</td>\n",
       "      <td>0.4245</td>\n",
       "      <td>0.4504</td>\n",
       "      <td>0.2430</td>\n",
       "      <td>0.3613</td>\n",
       "      <td>0.08758</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>84348301</td>\n",
       "      <td>M</td>\n",
       "      <td>11.42</td>\n",
       "      <td>20.38</td>\n",
       "      <td>77.58</td>\n",
       "      <td>386.1</td>\n",
       "      <td>0.14250</td>\n",
       "      <td>0.28390</td>\n",
       "      <td>0.2414</td>\n",
       "      <td>0.10520</td>\n",
       "      <td>...</td>\n",
       "      <td>14.91</td>\n",
       "      <td>26.50</td>\n",
       "      <td>98.87</td>\n",
       "      <td>567.7</td>\n",
       "      <td>0.2098</td>\n",
       "      <td>0.8663</td>\n",
       "      <td>0.6869</td>\n",
       "      <td>0.2575</td>\n",
       "      <td>0.6638</td>\n",
       "      <td>0.17300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>84358402</td>\n",
       "      <td>M</td>\n",
       "      <td>20.29</td>\n",
       "      <td>14.34</td>\n",
       "      <td>135.10</td>\n",
       "      <td>1297.0</td>\n",
       "      <td>0.10030</td>\n",
       "      <td>0.13280</td>\n",
       "      <td>0.1980</td>\n",
       "      <td>0.10430</td>\n",
       "      <td>...</td>\n",
       "      <td>22.54</td>\n",
       "      <td>16.67</td>\n",
       "      <td>152.20</td>\n",
       "      <td>1575.0</td>\n",
       "      <td>0.1374</td>\n",
       "      <td>0.2050</td>\n",
       "      <td>0.4000</td>\n",
       "      <td>0.1625</td>\n",
       "      <td>0.2364</td>\n",
       "      <td>0.07678</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 32 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         0  1      2      3       4       5        6        7       8   \\\n",
       "0    842302  M  17.99  10.38  122.80  1001.0  0.11840  0.27760  0.3001   \n",
       "1    842517  M  20.57  17.77  132.90  1326.0  0.08474  0.07864  0.0869   \n",
       "2  84300903  M  19.69  21.25  130.00  1203.0  0.10960  0.15990  0.1974   \n",
       "3  84348301  M  11.42  20.38   77.58   386.1  0.14250  0.28390  0.2414   \n",
       "4  84358402  M  20.29  14.34  135.10  1297.0  0.10030  0.13280  0.1980   \n",
       "\n",
       "        9   ...     22     23      24      25      26      27      28      29  \\\n",
       "0  0.14710  ...  25.38  17.33  184.60  2019.0  0.1622  0.6656  0.7119  0.2654   \n",
       "1  0.07017  ...  24.99  23.41  158.80  1956.0  0.1238  0.1866  0.2416  0.1860   \n",
       "2  0.12790  ...  23.57  25.53  152.50  1709.0  0.1444  0.4245  0.4504  0.2430   \n",
       "3  0.10520  ...  14.91  26.50   98.87   567.7  0.2098  0.8663  0.6869  0.2575   \n",
       "4  0.10430  ...  22.54  16.67  152.20  1575.0  0.1374  0.2050  0.4000  0.1625   \n",
       "\n",
       "       30       31  \n",
       "0  0.4601  0.11890  \n",
       "1  0.2750  0.08902  \n",
       "2  0.3613  0.08758  \n",
       "3  0.6638  0.17300  \n",
       "4  0.2364  0.07678  \n",
       "\n",
       "[5 rows x 32 columns]"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 利用pandas导入csv数据，查看前5行导入结果看是否正常\n",
    "import pandas as pd\n",
    "data_df = pd.read_csv(\"D:/work/homework/wdbcdata.txt\",header = None)\n",
    "data_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "d1d92871-3560-4575-bdfd-5053c30d6b5e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>22</th>\n",
       "      <th>23</th>\n",
       "      <th>24</th>\n",
       "      <th>25</th>\n",
       "      <th>26</th>\n",
       "      <th>27</th>\n",
       "      <th>28</th>\n",
       "      <th>29</th>\n",
       "      <th>30</th>\n",
       "      <th>31</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>842302</td>\n",
       "      <td>M</td>\n",
       "      <td>17.99</td>\n",
       "      <td>10.38</td>\n",
       "      <td>122.80</td>\n",
       "      <td>1001.0</td>\n",
       "      <td>0.11840</td>\n",
       "      <td>0.27760</td>\n",
       "      <td>0.30010</td>\n",
       "      <td>0.14710</td>\n",
       "      <td>...</td>\n",
       "      <td>25.380</td>\n",
       "      <td>17.33</td>\n",
       "      <td>184.60</td>\n",
       "      <td>2019.0</td>\n",
       "      <td>0.16220</td>\n",
       "      <td>0.66560</td>\n",
       "      <td>0.7119</td>\n",
       "      <td>0.2654</td>\n",
       "      <td>0.4601</td>\n",
       "      <td>0.11890</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>842517</td>\n",
       "      <td>M</td>\n",
       "      <td>20.57</td>\n",
       "      <td>17.77</td>\n",
       "      <td>132.90</td>\n",
       "      <td>1326.0</td>\n",
       "      <td>0.08474</td>\n",
       "      <td>0.07864</td>\n",
       "      <td>0.08690</td>\n",
       "      <td>0.07017</td>\n",
       "      <td>...</td>\n",
       "      <td>24.990</td>\n",
       "      <td>23.41</td>\n",
       "      <td>158.80</td>\n",
       "      <td>1956.0</td>\n",
       "      <td>0.12380</td>\n",
       "      <td>0.18660</td>\n",
       "      <td>0.2416</td>\n",
       "      <td>0.1860</td>\n",
       "      <td>0.2750</td>\n",
       "      <td>0.08902</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>84300903</td>\n",
       "      <td>M</td>\n",
       "      <td>19.69</td>\n",
       "      <td>21.25</td>\n",
       "      <td>130.00</td>\n",
       "      <td>1203.0</td>\n",
       "      <td>0.10960</td>\n",
       "      <td>0.15990</td>\n",
       "      <td>0.19740</td>\n",
       "      <td>0.12790</td>\n",
       "      <td>...</td>\n",
       "      <td>23.570</td>\n",
       "      <td>25.53</td>\n",
       "      <td>152.50</td>\n",
       "      <td>1709.0</td>\n",
       "      <td>0.14440</td>\n",
       "      <td>0.42450</td>\n",
       "      <td>0.4504</td>\n",
       "      <td>0.2430</td>\n",
       "      <td>0.3613</td>\n",
       "      <td>0.08758</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>84348301</td>\n",
       "      <td>M</td>\n",
       "      <td>11.42</td>\n",
       "      <td>20.38</td>\n",
       "      <td>77.58</td>\n",
       "      <td>386.1</td>\n",
       "      <td>0.14250</td>\n",
       "      <td>0.28390</td>\n",
       "      <td>0.24140</td>\n",
       "      <td>0.10520</td>\n",
       "      <td>...</td>\n",
       "      <td>14.910</td>\n",
       "      <td>26.50</td>\n",
       "      <td>98.87</td>\n",
       "      <td>567.7</td>\n",
       "      <td>0.20980</td>\n",
       "      <td>0.86630</td>\n",
       "      <td>0.6869</td>\n",
       "      <td>0.2575</td>\n",
       "      <td>0.6638</td>\n",
       "      <td>0.17300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>84358402</td>\n",
       "      <td>M</td>\n",
       "      <td>20.29</td>\n",
       "      <td>14.34</td>\n",
       "      <td>135.10</td>\n",
       "      <td>1297.0</td>\n",
       "      <td>0.10030</td>\n",
       "      <td>0.13280</td>\n",
       "      <td>0.19800</td>\n",
       "      <td>0.10430</td>\n",
       "      <td>...</td>\n",
       "      <td>22.540</td>\n",
       "      <td>16.67</td>\n",
       "      <td>152.20</td>\n",
       "      <td>1575.0</td>\n",
       "      <td>0.13740</td>\n",
       "      <td>0.20500</td>\n",
       "      <td>0.4000</td>\n",
       "      <td>0.1625</td>\n",
       "      <td>0.2364</td>\n",
       "      <td>0.07678</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>564</th>\n",
       "      <td>926424</td>\n",
       "      <td>M</td>\n",
       "      <td>21.56</td>\n",
       "      <td>22.39</td>\n",
       "      <td>142.00</td>\n",
       "      <td>1479.0</td>\n",
       "      <td>0.11100</td>\n",
       "      <td>0.11590</td>\n",
       "      <td>0.24390</td>\n",
       "      <td>0.13890</td>\n",
       "      <td>...</td>\n",
       "      <td>25.450</td>\n",
       "      <td>26.40</td>\n",
       "      <td>166.10</td>\n",
       "      <td>2027.0</td>\n",
       "      <td>0.14100</td>\n",
       "      <td>0.21130</td>\n",
       "      <td>0.4107</td>\n",
       "      <td>0.2216</td>\n",
       "      <td>0.2060</td>\n",
       "      <td>0.07115</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>565</th>\n",
       "      <td>926682</td>\n",
       "      <td>M</td>\n",
       "      <td>20.13</td>\n",
       "      <td>28.25</td>\n",
       "      <td>131.20</td>\n",
       "      <td>1261.0</td>\n",
       "      <td>0.09780</td>\n",
       "      <td>0.10340</td>\n",
       "      <td>0.14400</td>\n",
       "      <td>0.09791</td>\n",
       "      <td>...</td>\n",
       "      <td>23.690</td>\n",
       "      <td>38.25</td>\n",
       "      <td>155.00</td>\n",
       "      <td>1731.0</td>\n",
       "      <td>0.11660</td>\n",
       "      <td>0.19220</td>\n",
       "      <td>0.3215</td>\n",
       "      <td>0.1628</td>\n",
       "      <td>0.2572</td>\n",
       "      <td>0.06637</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>566</th>\n",
       "      <td>926954</td>\n",
       "      <td>M</td>\n",
       "      <td>16.60</td>\n",
       "      <td>28.08</td>\n",
       "      <td>108.30</td>\n",
       "      <td>858.1</td>\n",
       "      <td>0.08455</td>\n",
       "      <td>0.10230</td>\n",
       "      <td>0.09251</td>\n",
       "      <td>0.05302</td>\n",
       "      <td>...</td>\n",
       "      <td>18.980</td>\n",
       "      <td>34.12</td>\n",
       "      <td>126.70</td>\n",
       "      <td>1124.0</td>\n",
       "      <td>0.11390</td>\n",
       "      <td>0.30940</td>\n",
       "      <td>0.3403</td>\n",
       "      <td>0.1418</td>\n",
       "      <td>0.2218</td>\n",
       "      <td>0.07820</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>567</th>\n",
       "      <td>927241</td>\n",
       "      <td>M</td>\n",
       "      <td>20.60</td>\n",
       "      <td>29.33</td>\n",
       "      <td>140.10</td>\n",
       "      <td>1265.0</td>\n",
       "      <td>0.11780</td>\n",
       "      <td>0.27700</td>\n",
       "      <td>0.35140</td>\n",
       "      <td>0.15200</td>\n",
       "      <td>...</td>\n",
       "      <td>25.740</td>\n",
       "      <td>39.42</td>\n",
       "      <td>184.60</td>\n",
       "      <td>1821.0</td>\n",
       "      <td>0.16500</td>\n",
       "      <td>0.86810</td>\n",
       "      <td>0.9387</td>\n",
       "      <td>0.2650</td>\n",
       "      <td>0.4087</td>\n",
       "      <td>0.12400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>568</th>\n",
       "      <td>92751</td>\n",
       "      <td>B</td>\n",
       "      <td>7.76</td>\n",
       "      <td>24.54</td>\n",
       "      <td>47.92</td>\n",
       "      <td>181.0</td>\n",
       "      <td>0.05263</td>\n",
       "      <td>0.04362</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>...</td>\n",
       "      <td>9.456</td>\n",
       "      <td>30.37</td>\n",
       "      <td>59.16</td>\n",
       "      <td>268.6</td>\n",
       "      <td>0.08996</td>\n",
       "      <td>0.06444</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.2871</td>\n",
       "      <td>0.07039</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>569 rows × 32 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           0  1      2      3       4       5        6        7        8   \\\n",
       "0      842302  M  17.99  10.38  122.80  1001.0  0.11840  0.27760  0.30010   \n",
       "1      842517  M  20.57  17.77  132.90  1326.0  0.08474  0.07864  0.08690   \n",
       "2    84300903  M  19.69  21.25  130.00  1203.0  0.10960  0.15990  0.19740   \n",
       "3    84348301  M  11.42  20.38   77.58   386.1  0.14250  0.28390  0.24140   \n",
       "4    84358402  M  20.29  14.34  135.10  1297.0  0.10030  0.13280  0.19800   \n",
       "..        ... ..    ...    ...     ...     ...      ...      ...      ...   \n",
       "564    926424  M  21.56  22.39  142.00  1479.0  0.11100  0.11590  0.24390   \n",
       "565    926682  M  20.13  28.25  131.20  1261.0  0.09780  0.10340  0.14400   \n",
       "566    926954  M  16.60  28.08  108.30   858.1  0.08455  0.10230  0.09251   \n",
       "567    927241  M  20.60  29.33  140.10  1265.0  0.11780  0.27700  0.35140   \n",
       "568     92751  B   7.76  24.54   47.92   181.0  0.05263  0.04362  0.00000   \n",
       "\n",
       "          9   ...      22     23      24      25       26       27      28  \\\n",
       "0    0.14710  ...  25.380  17.33  184.60  2019.0  0.16220  0.66560  0.7119   \n",
       "1    0.07017  ...  24.990  23.41  158.80  1956.0  0.12380  0.18660  0.2416   \n",
       "2    0.12790  ...  23.570  25.53  152.50  1709.0  0.14440  0.42450  0.4504   \n",
       "3    0.10520  ...  14.910  26.50   98.87   567.7  0.20980  0.86630  0.6869   \n",
       "4    0.10430  ...  22.540  16.67  152.20  1575.0  0.13740  0.20500  0.4000   \n",
       "..       ...  ...     ...    ...     ...     ...      ...      ...     ...   \n",
       "564  0.13890  ...  25.450  26.40  166.10  2027.0  0.14100  0.21130  0.4107   \n",
       "565  0.09791  ...  23.690  38.25  155.00  1731.0  0.11660  0.19220  0.3215   \n",
       "566  0.05302  ...  18.980  34.12  126.70  1124.0  0.11390  0.30940  0.3403   \n",
       "567  0.15200  ...  25.740  39.42  184.60  1821.0  0.16500  0.86810  0.9387   \n",
       "568  0.00000  ...   9.456  30.37   59.16   268.6  0.08996  0.06444  0.0000   \n",
       "\n",
       "         29      30       31  \n",
       "0    0.2654  0.4601  0.11890  \n",
       "1    0.1860  0.2750  0.08902  \n",
       "2    0.2430  0.3613  0.08758  \n",
       "3    0.2575  0.6638  0.17300  \n",
       "4    0.1625  0.2364  0.07678  \n",
       "..      ...     ...      ...  \n",
       "564  0.2216  0.2060  0.07115  \n",
       "565  0.1628  0.2572  0.06637  \n",
       "566  0.1418  0.2218  0.07820  \n",
       "567  0.2650  0.4087  0.12400  \n",
       "568  0.0000  0.2871  0.07039  \n",
       "\n",
       "[569 rows x 32 columns]"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "9c34a995-90be-4058-8073-9a0da68bf414",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>22</th>\n",
       "      <th>23</th>\n",
       "      <th>24</th>\n",
       "      <th>25</th>\n",
       "      <th>26</th>\n",
       "      <th>27</th>\n",
       "      <th>28</th>\n",
       "      <th>29</th>\n",
       "      <th>30</th>\n",
       "      <th>31</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>564</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>565</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>566</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>567</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>568</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>569 rows × 32 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        0      1      2      3      4      5      6      7      8      9   \\\n",
       "0    False  False  False  False  False  False  False  False  False  False   \n",
       "1    False  False  False  False  False  False  False  False  False  False   \n",
       "2    False  False  False  False  False  False  False  False  False  False   \n",
       "3    False  False  False  False  False  False  False  False  False  False   \n",
       "4    False  False  False  False  False  False  False  False  False  False   \n",
       "..     ...    ...    ...    ...    ...    ...    ...    ...    ...    ...   \n",
       "564  False  False  False  False  False  False  False  False  False  False   \n",
       "565  False  False  False  False  False  False  False  False  False  False   \n",
       "566  False  False  False  False  False  False  False  False  False  False   \n",
       "567  False  False  False  False  False  False  False  False  False  False   \n",
       "568  False  False  False  False  False  False  False  False  False  False   \n",
       "\n",
       "     ...     22     23     24     25     26     27     28     29     30     31  \n",
       "0    ...  False  False  False  False  False  False  False  False  False  False  \n",
       "1    ...  False  False  False  False  False  False  False  False  False  False  \n",
       "2    ...  False  False  False  False  False  False  False  False  False  False  \n",
       "3    ...  False  False  False  False  False  False  False  False  False  False  \n",
       "4    ...  False  False  False  False  False  False  False  False  False  False  \n",
       "..   ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...  \n",
       "564  ...  False  False  False  False  False  False  False  False  False  False  \n",
       "565  ...  False  False  False  False  False  False  False  False  False  False  \n",
       "566  ...  False  False  False  False  False  False  False  False  False  False  \n",
       "567  ...  False  False  False  False  False  False  False  False  False  False  \n",
       "568  ...  False  False  False  False  False  False  False  False  False  False  \n",
       "\n",
       "[569 rows x 32 columns]"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>...</th>\n",
       "      <th>22</th>\n",
       "      <th>23</th>\n",
       "      <th>24</th>\n",
       "      <th>25</th>\n",
       "      <th>26</th>\n",
       "      <th>27</th>\n",
       "      <th>28</th>\n",
       "      <th>29</th>\n",
       "      <th>30</th>\n",
       "      <th>31</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>5.690000e+02</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "      <td>569.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.037183e+07</td>\n",
       "      <td>14.127292</td>\n",
       "      <td>19.289649</td>\n",
       "      <td>91.969033</td>\n",
       "      <td>654.889104</td>\n",
       "      <td>0.096360</td>\n",
       "      <td>0.104341</td>\n",
       "      <td>0.088799</td>\n",
       "      <td>0.048919</td>\n",
       "      <td>0.181162</td>\n",
       "      <td>...</td>\n",
       "      <td>16.269190</td>\n",
       "      <td>25.677223</td>\n",
       "      <td>107.261213</td>\n",
       "      <td>880.583128</td>\n",
       "      <td>0.132369</td>\n",
       "      <td>0.254265</td>\n",
       "      <td>0.272188</td>\n",
       "      <td>0.114606</td>\n",
       "      <td>0.290076</td>\n",
       "      <td>0.083946</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>1.250206e+08</td>\n",
       "      <td>3.524049</td>\n",
       "      <td>4.301036</td>\n",
       "      <td>24.298981</td>\n",
       "      <td>351.914129</td>\n",
       "      <td>0.014064</td>\n",
       "      <td>0.052813</td>\n",
       "      <td>0.079720</td>\n",
       "      <td>0.038803</td>\n",
       "      <td>0.027414</td>\n",
       "      <td>...</td>\n",
       "      <td>4.833242</td>\n",
       "      <td>6.146258</td>\n",
       "      <td>33.602542</td>\n",
       "      <td>569.356993</td>\n",
       "      <td>0.022832</td>\n",
       "      <td>0.157336</td>\n",
       "      <td>0.208624</td>\n",
       "      <td>0.065732</td>\n",
       "      <td>0.061867</td>\n",
       "      <td>0.018061</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>8.670000e+03</td>\n",
       "      <td>6.981000</td>\n",
       "      <td>9.710000</td>\n",
       "      <td>43.790000</td>\n",
       "      <td>143.500000</td>\n",
       "      <td>0.052630</td>\n",
       "      <td>0.019380</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.106000</td>\n",
       "      <td>...</td>\n",
       "      <td>7.930000</td>\n",
       "      <td>12.020000</td>\n",
       "      <td>50.410000</td>\n",
       "      <td>185.200000</td>\n",
       "      <td>0.071170</td>\n",
       "      <td>0.027290</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.156500</td>\n",
       "      <td>0.055040</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>8.692180e+05</td>\n",
       "      <td>11.700000</td>\n",
       "      <td>16.170000</td>\n",
       "      <td>75.170000</td>\n",
       "      <td>420.300000</td>\n",
       "      <td>0.086370</td>\n",
       "      <td>0.064920</td>\n",
       "      <td>0.029560</td>\n",
       "      <td>0.020310</td>\n",
       "      <td>0.161900</td>\n",
       "      <td>...</td>\n",
       "      <td>13.010000</td>\n",
       "      <td>21.080000</td>\n",
       "      <td>84.110000</td>\n",
       "      <td>515.300000</td>\n",
       "      <td>0.116600</td>\n",
       "      <td>0.147200</td>\n",
       "      <td>0.114500</td>\n",
       "      <td>0.064930</td>\n",
       "      <td>0.250400</td>\n",
       "      <td>0.071460</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>9.060240e+05</td>\n",
       "      <td>13.370000</td>\n",
       "      <td>18.840000</td>\n",
       "      <td>86.240000</td>\n",
       "      <td>551.100000</td>\n",
       "      <td>0.095870</td>\n",
       "      <td>0.092630</td>\n",
       "      <td>0.061540</td>\n",
       "      <td>0.033500</td>\n",
       "      <td>0.179200</td>\n",
       "      <td>...</td>\n",
       "      <td>14.970000</td>\n",
       "      <td>25.410000</td>\n",
       "      <td>97.660000</td>\n",
       "      <td>686.500000</td>\n",
       "      <td>0.131300</td>\n",
       "      <td>0.211900</td>\n",
       "      <td>0.226700</td>\n",
       "      <td>0.099930</td>\n",
       "      <td>0.282200</td>\n",
       "      <td>0.080040</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>8.813129e+06</td>\n",
       "      <td>15.780000</td>\n",
       "      <td>21.800000</td>\n",
       "      <td>104.100000</td>\n",
       "      <td>782.700000</td>\n",
       "      <td>0.105300</td>\n",
       "      <td>0.130400</td>\n",
       "      <td>0.130700</td>\n",
       "      <td>0.074000</td>\n",
       "      <td>0.195700</td>\n",
       "      <td>...</td>\n",
       "      <td>18.790000</td>\n",
       "      <td>29.720000</td>\n",
       "      <td>125.400000</td>\n",
       "      <td>1084.000000</td>\n",
       "      <td>0.146000</td>\n",
       "      <td>0.339100</td>\n",
       "      <td>0.382900</td>\n",
       "      <td>0.161400</td>\n",
       "      <td>0.317900</td>\n",
       "      <td>0.092080</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>9.113205e+08</td>\n",
       "      <td>28.110000</td>\n",
       "      <td>39.280000</td>\n",
       "      <td>188.500000</td>\n",
       "      <td>2501.000000</td>\n",
       "      <td>0.163400</td>\n",
       "      <td>0.345400</td>\n",
       "      <td>0.426800</td>\n",
       "      <td>0.201200</td>\n",
       "      <td>0.304000</td>\n",
       "      <td>...</td>\n",
       "      <td>36.040000</td>\n",
       "      <td>49.540000</td>\n",
       "      <td>251.200000</td>\n",
       "      <td>4254.000000</td>\n",
       "      <td>0.222600</td>\n",
       "      <td>1.058000</td>\n",
       "      <td>1.252000</td>\n",
       "      <td>0.291000</td>\n",
       "      <td>0.663800</td>\n",
       "      <td>0.207500</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8 rows × 31 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                 0           2           3           4            5   \\\n",
       "count  5.690000e+02  569.000000  569.000000  569.000000   569.000000   \n",
       "mean   3.037183e+07   14.127292   19.289649   91.969033   654.889104   \n",
       "std    1.250206e+08    3.524049    4.301036   24.298981   351.914129   \n",
       "min    8.670000e+03    6.981000    9.710000   43.790000   143.500000   \n",
       "25%    8.692180e+05   11.700000   16.170000   75.170000   420.300000   \n",
       "50%    9.060240e+05   13.370000   18.840000   86.240000   551.100000   \n",
       "75%    8.813129e+06   15.780000   21.800000  104.100000   782.700000   \n",
       "max    9.113205e+08   28.110000   39.280000  188.500000  2501.000000   \n",
       "\n",
       "               6           7           8           9           10  ...  \\\n",
       "count  569.000000  569.000000  569.000000  569.000000  569.000000  ...   \n",
       "mean     0.096360    0.104341    0.088799    0.048919    0.181162  ...   \n",
       "std      0.014064    0.052813    0.079720    0.038803    0.027414  ...   \n",
       "min      0.052630    0.019380    0.000000    0.000000    0.106000  ...   \n",
       "25%      0.086370    0.064920    0.029560    0.020310    0.161900  ...   \n",
       "50%      0.095870    0.092630    0.061540    0.033500    0.179200  ...   \n",
       "75%      0.105300    0.130400    0.130700    0.074000    0.195700  ...   \n",
       "max      0.163400    0.345400    0.426800    0.201200    0.304000  ...   \n",
       "\n",
       "               22          23          24           25          26  \\\n",
       "count  569.000000  569.000000  569.000000   569.000000  569.000000   \n",
       "mean    16.269190   25.677223  107.261213   880.583128    0.132369   \n",
       "std      4.833242    6.146258   33.602542   569.356993    0.022832   \n",
       "min      7.930000   12.020000   50.410000   185.200000    0.071170   \n",
       "25%     13.010000   21.080000   84.110000   515.300000    0.116600   \n",
       "50%     14.970000   25.410000   97.660000   686.500000    0.131300   \n",
       "75%     18.790000   29.720000  125.400000  1084.000000    0.146000   \n",
       "max     36.040000   49.540000  251.200000  4254.000000    0.222600   \n",
       "\n",
       "               27          28          29          30          31  \n",
       "count  569.000000  569.000000  569.000000  569.000000  569.000000  \n",
       "mean     0.254265    0.272188    0.114606    0.290076    0.083946  \n",
       "std      0.157336    0.208624    0.065732    0.061867    0.018061  \n",
       "min      0.027290    0.000000    0.000000    0.156500    0.055040  \n",
       "25%      0.147200    0.114500    0.064930    0.250400    0.071460  \n",
       "50%      0.211900    0.226700    0.099930    0.282200    0.080040  \n",
       "75%      0.339100    0.382900    0.161400    0.317900    0.092080  \n",
       "max      1.058000    1.252000    0.291000    0.663800    0.207500  \n",
       "\n",
       "[8 rows x 31 columns]"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 569 entries, 0 to 568\n",
      "Data columns (total 32 columns):\n",
      " #   Column  Non-Null Count  Dtype  \n",
      "---  ------  --------------  -----  \n",
      " 0   0       569 non-null    int64  \n",
      " 1   1       569 non-null    object \n",
      " 2   2       569 non-null    float64\n",
      " 3   3       569 non-null    float64\n",
      " 4   4       569 non-null    float64\n",
      " 5   5       569 non-null    float64\n",
      " 6   6       569 non-null    float64\n",
      " 7   7       569 non-null    float64\n",
      " 8   8       569 non-null    float64\n",
      " 9   9       569 non-null    float64\n",
      " 10  10      569 non-null    float64\n",
      " 11  11      569 non-null    float64\n",
      " 12  12      569 non-null    float64\n",
      " 13  13      569 non-null    float64\n",
      " 14  14      569 non-null    float64\n",
      " 15  15      569 non-null    float64\n",
      " 16  16      569 non-null    float64\n",
      " 17  17      569 non-null    float64\n",
      " 18  18      569 non-null    float64\n",
      " 19  19      569 non-null    float64\n",
      " 20  20      569 non-null    float64\n",
      " 21  21      569 non-null    float64\n",
      " 22  22      569 non-null    float64\n",
      " 23  23      569 non-null    float64\n",
      " 24  24      569 non-null    float64\n",
      " 25  25      569 non-null    float64\n",
      " 26  26      569 non-null    float64\n",
      " 27  27      569 non-null    float64\n",
      " 28  28      569 non-null    float64\n",
      " 29  29      569 non-null    float64\n",
      " 30  30      569 non-null    float64\n",
      " 31  31      569 non-null    float64\n",
      "dtypes: float64(30), int64(1), object(1)\n",
      "memory usage: 142.4+ KB\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0     0\n",
       "1     0\n",
       "2     0\n",
       "3     0\n",
       "4     0\n",
       "5     0\n",
       "6     0\n",
       "7     0\n",
       "8     0\n",
       "9     0\n",
       "10    0\n",
       "11    0\n",
       "12    0\n",
       "13    0\n",
       "14    0\n",
       "15    0\n",
       "16    0\n",
       "17    0\n",
       "18    0\n",
       "19    0\n",
       "20    0\n",
       "21    0\n",
       "22    0\n",
       "23    0\n",
       "24    0\n",
       "25    0\n",
       "26    0\n",
       "27    0\n",
       "28    0\n",
       "29    0\n",
       "30    0\n",
       "31    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>22</th>\n",
       "      <th>23</th>\n",
       "      <th>24</th>\n",
       "      <th>25</th>\n",
       "      <th>26</th>\n",
       "      <th>27</th>\n",
       "      <th>28</th>\n",
       "      <th>29</th>\n",
       "      <th>30</th>\n",
       "      <th>31</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>0 rows × 32 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]\n",
       "Index: []\n",
       "\n",
       "[0 rows x 32 columns]"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#数据检查\n",
    "data_df.isnull()\n",
    "data_df.describe()\n",
    "data_df.info()\n",
    "data_df.isnull().sum()     #检查空值\n",
    "data_df[data_df.duplicated( )]     #重复数据检查"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "02e976f9-00b8-493a-a985-4e318da97ef0",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "c92c381b-c2f8-42f9-a088-33214f1ea066",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>...</th>\n",
       "      <th>22</th>\n",
       "      <th>23</th>\n",
       "      <th>24</th>\n",
       "      <th>25</th>\n",
       "      <th>26</th>\n",
       "      <th>27</th>\n",
       "      <th>28</th>\n",
       "      <th>29</th>\n",
       "      <th>30</th>\n",
       "      <th>31</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>17.99</td>\n",
       "      <td>10.38</td>\n",
       "      <td>122.80</td>\n",
       "      <td>1001.0</td>\n",
       "      <td>0.11840</td>\n",
       "      <td>0.27760</td>\n",
       "      <td>0.3001</td>\n",
       "      <td>0.14710</td>\n",
       "      <td>0.2419</td>\n",
       "      <td>0.07871</td>\n",
       "      <td>...</td>\n",
       "      <td>25.38</td>\n",
       "      <td>17.33</td>\n",
       "      <td>184.60</td>\n",
       "      <td>2019.0</td>\n",
       "      <td>0.1622</td>\n",
       "      <td>0.6656</td>\n",
       "      <td>0.7119</td>\n",
       "      <td>0.2654</td>\n",
       "      <td>0.4601</td>\n",
       "      <td>0.11890</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20.57</td>\n",
       "      <td>17.77</td>\n",
       "      <td>132.90</td>\n",
       "      <td>1326.0</td>\n",
       "      <td>0.08474</td>\n",
       "      <td>0.07864</td>\n",
       "      <td>0.0869</td>\n",
       "      <td>0.07017</td>\n",
       "      <td>0.1812</td>\n",
       "      <td>0.05667</td>\n",
       "      <td>...</td>\n",
       "      <td>24.99</td>\n",
       "      <td>23.41</td>\n",
       "      <td>158.80</td>\n",
       "      <td>1956.0</td>\n",
       "      <td>0.1238</td>\n",
       "      <td>0.1866</td>\n",
       "      <td>0.2416</td>\n",
       "      <td>0.1860</td>\n",
       "      <td>0.2750</td>\n",
       "      <td>0.08902</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>19.69</td>\n",
       "      <td>21.25</td>\n",
       "      <td>130.00</td>\n",
       "      <td>1203.0</td>\n",
       "      <td>0.10960</td>\n",
       "      <td>0.15990</td>\n",
       "      <td>0.1974</td>\n",
       "      <td>0.12790</td>\n",
       "      <td>0.2069</td>\n",
       "      <td>0.05999</td>\n",
       "      <td>...</td>\n",
       "      <td>23.57</td>\n",
       "      <td>25.53</td>\n",
       "      <td>152.50</td>\n",
       "      <td>1709.0</td>\n",
       "      <td>0.1444</td>\n",
       "      <td>0.4245</td>\n",
       "      <td>0.4504</td>\n",
       "      <td>0.2430</td>\n",
       "      <td>0.3613</td>\n",
       "      <td>0.08758</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>11.42</td>\n",
       "      <td>20.38</td>\n",
       "      <td>77.58</td>\n",
       "      <td>386.1</td>\n",
       "      <td>0.14250</td>\n",
       "      <td>0.28390</td>\n",
       "      <td>0.2414</td>\n",
       "      <td>0.10520</td>\n",
       "      <td>0.2597</td>\n",
       "      <td>0.09744</td>\n",
       "      <td>...</td>\n",
       "      <td>14.91</td>\n",
       "      <td>26.50</td>\n",
       "      <td>98.87</td>\n",
       "      <td>567.7</td>\n",
       "      <td>0.2098</td>\n",
       "      <td>0.8663</td>\n",
       "      <td>0.6869</td>\n",
       "      <td>0.2575</td>\n",
       "      <td>0.6638</td>\n",
       "      <td>0.17300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20.29</td>\n",
       "      <td>14.34</td>\n",
       "      <td>135.10</td>\n",
       "      <td>1297.0</td>\n",
       "      <td>0.10030</td>\n",
       "      <td>0.13280</td>\n",
       "      <td>0.1980</td>\n",
       "      <td>0.10430</td>\n",
       "      <td>0.1809</td>\n",
       "      <td>0.05883</td>\n",
       "      <td>...</td>\n",
       "      <td>22.54</td>\n",
       "      <td>16.67</td>\n",
       "      <td>152.20</td>\n",
       "      <td>1575.0</td>\n",
       "      <td>0.1374</td>\n",
       "      <td>0.2050</td>\n",
       "      <td>0.4000</td>\n",
       "      <td>0.1625</td>\n",
       "      <td>0.2364</td>\n",
       "      <td>0.07678</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 30 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      2      3       4       5        6        7       8        9       10  \\\n",
       "0  17.99  10.38  122.80  1001.0  0.11840  0.27760  0.3001  0.14710  0.2419   \n",
       "1  20.57  17.77  132.90  1326.0  0.08474  0.07864  0.0869  0.07017  0.1812   \n",
       "2  19.69  21.25  130.00  1203.0  0.10960  0.15990  0.1974  0.12790  0.2069   \n",
       "3  11.42  20.38   77.58   386.1  0.14250  0.28390  0.2414  0.10520  0.2597   \n",
       "4  20.29  14.34  135.10  1297.0  0.10030  0.13280  0.1980  0.10430  0.1809   \n",
       "\n",
       "        11  ...     22     23      24      25      26      27      28      29  \\\n",
       "0  0.07871  ...  25.38  17.33  184.60  2019.0  0.1622  0.6656  0.7119  0.2654   \n",
       "1  0.05667  ...  24.99  23.41  158.80  1956.0  0.1238  0.1866  0.2416  0.1860   \n",
       "2  0.05999  ...  23.57  25.53  152.50  1709.0  0.1444  0.4245  0.4504  0.2430   \n",
       "3  0.09744  ...  14.91  26.50   98.87   567.7  0.2098  0.8663  0.6869  0.2575   \n",
       "4  0.05883  ...  22.54  16.67  152.20  1575.0  0.1374  0.2050  0.4000  0.1625   \n",
       "\n",
       "       30       31  \n",
       "0  0.4601  0.11890  \n",
       "1  0.2750  0.08902  \n",
       "2  0.3613  0.08758  \n",
       "3  0.6638  0.17300  \n",
       "4  0.2364  0.07678  \n",
       "\n",
       "[5 rows x 30 columns]"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 利用concat()函数把转换后的数据对象全部合并在一起变成新的数据对象，命名为trainData_X\n",
    "trainData_X = data_df.iloc[0:,2:]\n",
    "trainData_X.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "f15595db-73fe-48d9-b7ac-112c0ad08492",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "target\n",
       "0    357\n",
       "1    212\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构造目标变量y的数据对象\n",
    "# 当前的目标变量good_bad的取值是'good'和'bad'，一般我们习惯把二分类的类别值编码为0和1，1一般表示类别比较少的那一类，他们往往是我们感兴趣的\n",
    "data_df['target'] = 0\n",
    "data_df.loc[(data_df.iloc[0:569,1] == 'M'), 'target'] = 1\n",
    "\n",
    "trainData_y = data_df['target'] \n",
    "trainData_y.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "0dad3956-a347-4d6f-ade4-33acc68c1698",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拆分训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(trainData_X, trainData_y, test_size=0.3, random_state=123456)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "id": "31ce5e32-9aca-4a04-b9e5-dff69574bc8d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(398, 30) (171, 30)\n"
     ]
    }
   ],
   "source": [
    "# 查看拆分后的train和test的shape，确认拆分正确\n",
    "print(X_train.shape,X_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "7487ed8d-9fde-4256-9269-5e71983d0a2e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-3 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-3 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-3 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-3 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-3 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-3 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LogisticRegression(solver=&#x27;liblinear&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" checked><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;LogisticRegression<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>LogisticRegression(solver=&#x27;liblinear&#x27;)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "LogisticRegression(solver='liblinear')"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "# 通过LogisticRegression类定义一个逻辑回归模型名字叫lr\n",
    "lr = LogisticRegression(solver='liblinear')\n",
    "\n",
    "# 对lr模型进行训练(fit)\n",
    "lr.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "df0e6a05-55a8-4002-8c72-b88444a75e97",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 查看模型结果\n",
    "print('截距:',lr.intercept_ )  #截距\n",
    "print('30个拟合的系数：\\n',lr.coef_)       #系数\n",
    "import numpy as np\n",
    "# 把变量名称和系数对应在一起方便查看\n",
    "pd.DataFrame(list(zip(np.transpose(lr.coef_), X_train.columns)), columns=['coef', 'columns'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fdf82f27-aac1-447a-95b3-a4cc01eee7d0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 初步调参\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "parameters = {\n",
    "    'penalty': ('l1', 'l2'),\n",
    "    'C': (0.01, 0.1, 1, 10),\n",
    "}\n",
    "\n",
    "lr = LogisticRegression(solver='liblinear', max_iter=1000)  # 将最大迭代次数设置为1000\n",
    "lr_search = GridSearchCV(lr, parameters, scoring='accuracy', cv=5)\n",
    "lr_search.fit(X_train, y_train)\n",
    "\n",
    "#查看最佳结果\n",
    "print(lr_search.best_estimator_)\n",
    "print(lr_search.best_score_)\n",
    "print(lr_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a6d15283-6242-4d1f-9a08-ea63bc21d984",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 用最佳参数重新训练模型\n",
    "lr = LogisticRegression(C=10,penalty='l1',solver='liblinear')\n",
    "lr.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "dac98348-358d-4da9-a202-9405d71e4316",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "分类评估汇总报告:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "           0       0.93      0.96      0.95       110\n",
      "           1       0.93      0.87      0.90        61\n",
      "\n",
      "    accuracy                           0.93       171\n",
      "   macro avg       0.93      0.92      0.92       171\n",
      "weighted avg       0.93      0.93      0.93       171\n",
      "\n",
      "误分类矩阵:\n",
      " [[106   4]\n",
      " [  8  53]]\n",
      "AUC值: 0.9891207153502235\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x17b638ba900>]"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x17b664dea20>]"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "Text(0.5, 0, 'False Positive Rate')"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'True Positive Rate')"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Receiver operating characteristic example')"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x17b63854320>"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHFCAYAAAAOmtghAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABueklEQVR4nO3dd1hT59sH8G8YCUNAQVmigFbcVoWK4t6Ko7W1uOrAUVfrQOuorah11YFo3QurdeD+aUu11D2rIm5bF25QQQUU2c/7x3mJRkAJBg6E7+e6csl5csadQ0xunqkQQggQERER6QkDuQMgIiIi0iUmN0RERKRXmNwQERGRXmFyQ0RERHqFyQ0RERHpFSY3REREpFeY3BAREZFeYXJDREREeoXJDREREekVJjeUyZo1a6BQKNQPIyMjODg4oGvXrrh+/brc4QEAXFxc0KdPH7nD0CuLFy/GmjVrMpXfvn0bCoUiy+cKgoz45syZI3coWktISMCkSZNw8ODBPDn/wYMHoVAotD5/YX0vFEQKhQKTJk2SO4wix0juAKjgCgoKQqVKlZCYmIhjx45h2rRpOHDgAP7991+UKFFC1th27NgBS0tLWWPQN4sXL0bJkiUzJY0ODg44ceIEypcvL09geiwhIQGTJ08GADRp0kTn569duzZOnDiBKlWqaHUc3wtU2DG5oWxVq1YNHh4eAKQP3rS0NPj7+2Pnzp3w9fWVNbZatWrl+zXT0tKQmpoKlUqV79fWlhACiYmJMDU1/eBzqVQq1K1bVwdRFW6vXr2CiYkJFAqF3KG8V0pKChQKBSwtLXX6u+N7gQoLNktRjmUkOo8ePdIoP3PmDDp27Ahra2uYmJigVq1a2Lx5c6bjHzx4gK+//hplypSBUqmEo6MjOnfurHG+uLg4jB49Gq6urlAqlShdujRGjBiBly9fapzrzWapJ0+eQKlU4scff8x0zX///RcKhQILFixQl0VFRWHgwIFwcnKCUqmEq6srJk+ejNTUVPU+GdXvs2bNwtSpU+Hq6gqVSoUDBw5ke38SExMxfvx4jdiHDh2K58+fZ4q9ffv22LFjB2rUqAETExOUK1dOI0Zt74dCocA333yDpUuXonLlylCpVPj1118BAJMnT4anpyesra1haWmJ2rVrY9WqVXhzzVwXFxdcvnwZhw4dUjdHuri4aNyLN5siJk2aBIVCgcuXL6Nbt26wsrKCnZ0d+vbti9jYWI3Ynj9/jn79+sHa2hrFihVDu3btcOvWrRxX1z9//hyjRo1CuXLloFKpYGtrC29vb/z777+Z9g0ICICrqyuKFSuGevXq4eTJkxrPnzlzBl27doWLiwtMTU3h4uKCbt264c6dOxr7ZTTN/vXXX+jbty9KlSoFMzMzJCUl4caNG/D19UWFChVgZmaG0qVLo0OHDrh48aJWsd++fRulSpVS/44y7vubtSXXr19H9+7dYWtrC5VKhcqVK2PRokUa18hoelq3bh1GjRqF0qVLQ6VS4caNG1k2S926dQtdu3aFo6MjVCoV7Ozs0Lx5c5w7dw6A9u8FQPp/1q1bN9jZ2UGlUqFs2bLo1asXkpKS3vWrRXJyMqZOnYpKlSpBpVKhVKlS8PX1xZMnT9T7zJw5EwYGBti9e7fGsX369IGZmZn6vicmJmLUqFGoWbMmrKysYG1tjXr16uF///tfputm/H8JCgpCxYoVYWpqCg8PD5w8eRJCCMyePVv9PmrWrBlu3LihcXyTJk1QrVo1HDlyBHXr1oWpqSlKly6NH3/8EWlpae98zUDOPoPow7DmhnIsIiICAODm5qYuO3DgANq0aQNPT08sXboUVlZW2LRpE7p06YKEhAT1B/WDBw/wySefICUlBd9//z1q1KiBmJgY7N27F8+ePYOdnR0SEhLQuHFj3L9/X73P5cuXMXHiRFy8eBF///13ln81lypVCu3bt8evv/6KyZMnw8Dgdc4eFBQEpVKJHj16AJA+VOrUqQMDAwNMnDgR5cuXx4kTJzB16lTcvn0bQUFBGudesGAB3NzcMGfOHFhaWqJChQpZ3hshBD777DPs27cP48ePR8OGDXHhwgX4+/vjxIkTOHHihEaNz7lz5zBixAhMmjQJ9vb2WL9+PYYPH47k5GSMHj0aALS+Hzt37sSRI0cwceJE2Nvbw9bWFoD0hTRw4ECULVsWAHDy5El8++23ePDgASZOnAhAaubr3LkzrKyssHjxYgDIUQ3VF198gS5duqBfv364ePEixo8fDwBYvXo1ACA9PR0dOnTAmTNnMGnSJHUzSZs2bd57bgCIj49HgwYNcPv2bYwdOxaenp548eIFDh8+jMjISFSqVEm976JFi1CpUiUEBgYCAH788Ud4e3sjIiICVlZW6ntRsWJFdO3aFdbW1oiMjMSSJUvwySef4MqVKyhZsqTG9fv27Yt27dph3bp1ePnyJYyNjfHw4UPY2Nhg5syZKFWqFJ4+fYpff/0Vnp6eCA8PR8WKFXMUu5eXF/bs2YM2bdqgX79+6N+/PwCoE54rV67Ay8sLZcuWxdy5c2Fvb4+9e/di2LBhiI6Ohr+/v0as48ePR7169bB06VIYGBjA1tYWUVFRme6pt7c30tLSMGvWLJQtWxbR0dE4fvy4OgnX9r1w/vx5NGjQACVLlsSUKVNQoUIFREZGYteuXUhOTs722PT0dHz66ac4cuQIxowZAy8vL9y5cwf+/v5o0qQJzpw5A1NTU4wdOxZHjhxB7969ER4eDmdnZwQFBeHXX3/FypUrUb16dQBAUlISnj59itGjR6N06dJITk7G33//jc8//xxBQUHo1auXxvV///13hIeHY+bMmVAoFBg7dizatWuH3r1749atW1i4cCFiY2Ph5+eHL774AufOndP4/xYVFYWuXbti3LhxmDJlCv744w9MnToVz549w8KFC7O9X9p+BlEuCaK3BAUFCQDi5MmTIiUlRcTHx4s9e/YIe3t70ahRI5GSkqLet1KlSqJWrVoaZUII0b59e+Hg4CDS0tKEEEL07dtXGBsbiytXrmR73RkzZggDAwNx+vRpjfKtW7cKACIkJERd5uzsLHr37q3e3rVrlwAg/vrrL3VZamqqcHR0FF988YW6bODAgaJYsWLizp07GteYM2eOACAuX74shBAiIiJCABDly5cXycnJ77tlYs+ePQKAmDVrlkZ5cHCwACCWL1+uEbtCoRDnzp3T2Ldly5bC0tJSvHz5Uuv7AUBYWVmJp0+fvjPOtLQ0kZKSIqZMmSJsbGxEenq6+rmqVauKxo0bZzom414EBQWpy/z9/bN8vUOGDBEmJibq8/7xxx8CgFiyZInGfjNmzBAAhL+//zvjnTJligAgQkNDs90nI77q1auL1NRUdfmpU6cEALFx48Zsj01NTRUvXrwQ5ubmYv78+eryjP8DvXr1emd8GedITk4WFSpUECNHjtQq9idPnmR7H1q3bi2cnJxEbGysRvk333wjTExM1L/rAwcOCACiUaNGmc6R8dyBAweEEEJER0cLACIwMPCdr0mb90KzZs1E8eLFxePHj995zrdt3LhRABDbtm3TKD99+rQAIBYvXqwui46OFk5OTqJOnTri7NmzwszMTHz11VfvPH9qaqpISUkR/fr1E7Vq1dJ4DoCwt7cXL168UJft3LlTABA1a9bU+H8RGBgoAIgLFy6oyxo3biwAiP/9738a5x0wYIAwMDDQ+Hx5+/eb088g+jBslqJs1a1bF8bGxrCwsECbNm1QokQJ/O9//4ORkVThd+PGDfz777/qWpHU1FT1w9vbG5GRkfjvv/8AAH/++SeaNm2KypUrZ3u933//HdWqVUPNmjU1ztW6dev3jvho27Yt7O3tNf7q2bt3Lx4+fIi+fftqXKNp06ZwdHTUuEbbtm0BAIcOHdI4b8eOHWFsbPzee7V//34AyNQB88svv4S5uTn27dunUV61alV8/PHHGmXdu3dHXFwczp49m6v70axZsyw7eu/fvx8tWrSAlZUVDA0NYWxsjIkTJyImJgaPHz9+72t7l44dO2ps16hRA4mJierzZtxPHx8fjf26deuWo/P/+eefcHNzQ4sWLd67b7t27WBoaKgRCwCNJqcXL15g7Nix+Oijj2BkZAQjIyMUK1YML1++xNWrVzOd84svvshUlpqaiunTp6NKlSpQKpUwMjKCUqnE9evXNc6hTexvS0xMxL59+9CpUyeYmZll+r+VmJiYqcktq1jfZm1tjfLly2P27NkICAhAeHg40tPTtY4vQ0JCAg4dOgQfHx91jVNO/f777yhevDg6dOig8fpq1qwJe3t7jfe3jY0NgoODcfbsWXVt1tKlSzOdc8uWLahfvz6KFSsGIyMjGBsbY9WqVVn+bps2bQpzc3P1dsZnU9u2bTVqaDLK3266tLCwyPT+7969O9LT03H48OF3vm5tPoMod5jcULbWrl2L06dPY//+/Rg4cCCuXr2q8aWU0Vdm9OjRMDY21ngMGTIEABAdHQ1A6hfj5OT0zus9evQIFy5cyHQuCwsLCCHU58qKkZERevbsiR07dqir19esWQMHBwe0bt1a4xq7d+/OdI2qVatqxJvBwcEhR/cqJiYGRkZGmT7gFQoF7O3tERMTo1Fub2+f6RwZZRn7ans/sor11KlTaNWqFQBgxYoVOHbsGE6fPo0JEyYAkDrJfggbGxuN7YwmiIzzZtwXa2trjf3s7OxydP6cvG9yGgsgffksXLgQ/fv3x969e3Hq1CmcPn0apUqVyvJeZHVP/fz88OOPP+Kzzz7D7t278c8//+D06dP4+OOPNc6hTexvi4mJQWpqKn755ZdMv39vb28AuXuvKhQK7Nu3D61bt8asWbNQu3ZtlCpVCsOGDUN8fLzWcT579gxpaWm5ep2PHj3C8+fPoVQqM73GqKioTK/P09MTVatWRWJiIgYPHqyRmADA9u3b4ePjg9KlS+O3337DiRMncPr0afTt2xeJiYmZrv/2e1KpVL6z/O1zZPUefvv/cHavW5vPIMod9rmhbFWuXFndibhp06ZIS0vDypUrsXXrVnTu3FndP2H8+PH4/PPPszxHRv+DUqVK4f79+++8XsmSJWFqaqrur5HV8+/i6+uL2bNnq/v87Nq1CyNGjND4a75kyZKoUaMGpk2bluU5HB0dNbZzOjLGxsYGqampePLkiUaCI4RAVFQUPvnkE439s+oLkVGW8SWt7f3IKtZNmzbB2NgYv//+O0xMTNTlO3fuzNHr+lAZ9+Xp06caXxpZvf6s5OR9k1OxsbH4/fff4e/vj3HjxqnLM/pqZCWre/rbb7+hV69emD59ukZ5dHQ0ihcvrpPYS5QoAUNDQ/Ts2RNDhw7Nch9XV9f3xpoVZ2dnrFq1CgBw7do1bN68GZMmTUJycnKWtSHvYm1tDUNDw1y9zpIlS8LGxgZ79uzJ8nkLCwuNbX9/f1y8eBHu7u6YOHEi2rdvj3Llyqmf/+233+Dq6org4GCNe/G+Ts259fbACiDz/+GsaPsZRLnD5IZybNasWdi2bRsmTpyIzz//HBUrVkSFChVw/vz5TB/0b2vbti3WrVuH//77T53wvK19+/aYPn06bGxsMn1w50TlypXh6emJoKAgpKWlISkpKdOQ9fbt2yMkJATly5fX6Vw9zZs3x6xZs/Dbb79h5MiR6vJt27bh5cuXaN68ucb+ly9fxvnz5zWapjZs2AALCwvUrl1bHeuH3A8A6kkY30zwXr16hXXr1mXaV6VSfXBNztsaN26MWbNmITg4GIMHD1aXb9q0KUfHt23bFhMnTsT+/fvRrFmzD4pFoVBACJGpg+vKlStzNMLlzfO8fY4//vgDDx48wEcffaRV7FnVLgGAmZkZmjZtivDwcNSoUUNde6Brbm5u+OGHH7Bt2zZ1c2hGXDl5L5iamqJx48bYsmULpk2b9t4/QN7Uvn17bNq0CWlpafD09HznvqGhoZgxYwZ++OEHjBgxAjVr1kSXLl1w7Ngx9b1RKBRQKpWZOv1mNVpKF+Lj47Fr1y6NpqkNGzbAwMAAjRo1yva4vPoMIk1MbijHSpQogfHjx2PMmDHYsGEDvvrqKyxbtgxt27ZF69at0adPH5QuXRpPnz7F1atXcfbsWWzZsgUAMGXKFPz5559o1KgRvv/+e1SvXh3Pnz/Hnj174Ofnh0qVKmHEiBHYtm0bGjVqhJEjR6JGjRpIT0/H3bt38ddff2HUqFHv/RDs27cvBg4ciIcPH8LLyytTIjVlyhSEhobCy8sLw4YNQ8WKFZGYmIjbt28jJCQES5cuzVUVe8uWLdG6dWuMHTsWcXFxqF+/vnq0VK1atdCzZ0+N/R0dHdGxY0dMmjQJDg4O+O233xAaGoqff/4ZZmZmAKCT+9GuXTsEBASge/fu+PrrrxETE4M5c+ZkOYKlevXq2LRpE4KDg1GuXDmYmJioR6LkVps2bVC/fn2MGjUKcXFxcHd3x4kTJ7B27VoA0BjZlpURI0YgODgYn376KcaNG4c6derg1atXOHToENq3b4+mTZvmOBZLS0s0atQIs2fPRsmSJeHi4oJDhw5h1apVGjUu79O+fXusWbMGlSpVQo0aNRAWFobZs2dnet/kJHYLCws4Ozvjf//7H5o3bw5ra2t1bPPnz0eDBg3QsGFDDB48GC4uLoiPj8eNGzewe/dudT8vbVy4cAHffPMNvvzyS1SoUAFKpRL79+/HhQsXNGqztHkvBAQEoEGDBvD09MS4cePw0Ucf4dGjR9i1axeWLVuWqQYmQ9euXbF+/Xp4e3tj+PDhqFOnDoyNjXH//n0cOHAAn376KTp16oTIyEh89dVXaNy4Mfz9/WFgYIDg4GA0atQIY8aMUY+Oa9++PbZv344hQ4agc+fOuHfvHn766Sc4ODjkyczqNjY2GDx4MO7evQs3NzeEhIRgxYoVGDx4sHpkYlby6jOI3iJvf2YqiDJGirw9SkcIIV69eiXKli0rKlSooB6Zcv78eeHj4yNsbW2FsbGxsLe3F82aNRNLly7VOPbevXuib9++wt7eXhgbGwtHR0fh4+MjHj16pN7nxYsX4ocffhAVK1YUSqVSWFlZierVq4uRI0eKqKgo9X5vj5bKEBsbK0xNTQUAsWLFiixf35MnT8SwYcOEq6urMDY2FtbW1sLd3V1MmDBBPXoiY1TI7Nmzc3zfXr16JcaOHSucnZ2FsbGxcHBwEIMHDxbPnj3T2M/Z2Vm0a9dObN26VVStWlUolUrh4uIiAgICMp0zp/cDgBg6dGiWca1evVpUrFhRqFQqUa5cOTFjxgyxatUqAUBERESo97t9+7Zo1aqVsLCwEACEs7Ozxr3IarTUkydPNK6V8d5587xPnz4Vvr6+onjx4sLMzEy0bNlSnDx5UgDQGKGUnWfPnonhw4eLsmXLCmNjY2FrayvatWsn/v33X434svpd4a2RKvfv3xdffPGFKFGihLCwsBBt2rQRly5dyvR+etf/gWfPnol+/foJW1tbYWZmJho0aCCOHDkiGjdunGmE0ftiF0KIv//+W9SqVUuoVCoBQCOOiIgI0bdvX1G6dGlhbGwsSpUqJby8vMTUqVPV+2SMiNqyZUumWN8eLfXo0SPRp08fUalSJWFubi6KFSsmatSoIebNm6cx0kyb94IQQly5ckV8+eWXwsbGRiiVSlG2bFnRp08fkZiYmCmmN6WkpIg5c+aIjz/+WJiYmIhixYqJSpUqiYEDB4rr16+L1NRU0bhxY2FnZyciIyM1jp09e7YAIHbs2KEumzlzpnBxcREqlUpUrlxZrFixQv1efVNW/1+yex9ldX8bN24sqlatKg4ePCg8PDyESqUSDg4O4vvvv880cvTt96AQOfsMog+jEOKNmbyIKM+5uLigWrVq+P333+UORTYbNmxAjx49cOzYMXh5eckdDpFWmjRpgujoaFy6dEnuUCgbbJYiojy1ceNGPHjwANWrV4eBgQFOnjyJ2bNno1GjRkxsiChPMLkhojxlYWGBTZs2YerUqXj58iUcHBzQp08fTJ06Ve7QiEhPsVmKiIiI9Aon8SMiIiK9wuSGiIiI9AqTGyIiItIrRa5DcXp6Oh4+fAgLC4scT1dORERE8hJCID4+Ho6Oju+dALTIJTcPHz5EmTJl5A6DiIiIcuHevXvvncW5yCU3GVOB37t3D5aWljJHQ0RERDkRFxeHMmXKZLukx5uKXHKT0RRlaWnJ5IaIiKiQyUmXEnYoJiIiIr3C5IaIiIj0CpMbIiIi0itMboiIiEivMLkhIiIivcLkhoiIiPQKkxsiIiLSK0xuiIiISK8wuSEiIiK9wuSGiIiI9Iqsyc3hw4fRoUMHODo6QqFQYOfOne895tChQ3B3d4eJiQnKlSuHpUuX5n2gREREVGjImty8fPkSH3/8MRYuXJij/SMiIuDt7Y2GDRsiPDwc33//PYYNG4Zt27blcaRERERUWMi6cGbbtm3Rtm3bHO+/dOlSlC1bFoGBgQCAypUr48yZM5gzZw6++OKLPIqSiIiICpNCtSr4iRMn0KpVK42y1q1bY9WqVUhJSYGxsXGmY5KSkpCUlKTejouLy/M4i5I/LkQiIPQ/vExKkzsUIiIqQEpZqLD72wayXLtQJTdRUVGws7PTKLOzs0Nqaiqio6Ph4OCQ6ZgZM2Zg8uTJ+RVikRMQ+h9uPnkpdxhERCQj0+RE2LyKxX0ru/fvnA8KVXIDAAqFQmNbCJFleYbx48fDz89PvR0XF4cyZcrkXYBFTEaNjYECsLUwkTkaIiLKb+UeRWDaxp+QrjBA38ELkaSUvgtKWahki6lQJTf29vaIiorSKHv8+DGMjIxgY2OT5TEqlQoqlXw3uKiwtTDBye+byx0GERHlFyGA1auBn74FEhMBR0cc+tIFqFpV7sgK1zw39erVQ2hoqEbZX3/9BQ8Pjyz72xAREVEeiI8HevYE+veXEps2bYBz5wpEYgPIXHPz4sUL3LhxQ70dERGBc+fOwdraGmXLlsX48ePx4MEDrF27FgAwaNAgLFy4EH5+fhgwYABOnDiBVatWYePGjXK9hELvQzsEP45P1HFERERUoJ0/D/j4ANeuAYaGwLRpwHffAQYFp75E1uTmzJkzaNq0qXo7o29M7969sWbNGkRGRuLu3bvq511dXRESEoKRI0di0aJFcHR0xIIFCzgM/APoqkOwucpQB9EQEVGBN2aMlNg4OQGbNgH168sdUSYKkdEjt4iIi4uDlZUVYmNjYWlpKXc4sqs7fR+i4hI/qEOwucoQo1pVhHf1zKPViIhIzzx4AIwfD8ybB2TT3zUvaPP9Xag6FFPeYYdgIiLKUlgYEBoKjBsnbZcuDfx/d5GCiskNERERZSYEsHAhMHo0kJwsdRbu0EHuqHKEyQ0RERFpevYM6NcP2LFD2v7sM6CBPLMN5waTmyLm7dFRHO1EREQa/vkH6NoVuH0bUCqBOXOAb74BspkstyBiclPEZDc6iqOdiIgIS5YAw4YBqalAuXLA5s2Au7vcUWmNyU0Rk9VyCRmjnYiIqIiztZUSmy+/BFasAKys5I4oV5jcFFEcHUVERACAly8Bc3Pp5y++AA4flvrXFKJmqLcVnOkEiYiIKP+kpwMzZwIVKgAPH74ub9iwUCc2AGtuCj1tl09gB2IiIsKTJ0CvXsCePdL22rWv57HRA0xuCrncLp/ADsREREXU4cNAt25SbY2JiTSXTd++ckelU0xuCrmsOgi/DzsQExEVQWlpwIwZgL+/1CRVubI0GqpaNbkj0zkmN3qCHYSJiOidAgOBH3+Ufu7dG1i06HVHYj3DDsVERERFwaBBwCefAGvWSA89TWwA1twQERHpp7Q0YP164KuvAAMDKZk5eVL6Wc8xuSlkuHwCERG918OHQPfuwKFDQFQUMGaMVF4EEhuAyU2hw+UTiIjonfbulWproqOBYsWAMmXkjijfMbkpZLh8AhERZSk1VeowPHOmtP3xx9JoKDc3eeOSAZObQoqjo4iISO3+fWnumqNHpe3Bg4GAAGkemyKIyQ0REVFhFxUF/PMPYGkpLXjp4yN3RLJickNERFQYCfF6DSgPD+C33wB3d6B8eXnjKgCKRrdpIiIifXL7NtC0KRAe/rrMx4eJzf9jckNERFSY7NwJ1KolDfMeOFCqwSENTG6IiIgKg+RkYMQIoFMn4PlzwNNTGg2V0TRFakxuiIiICrpbt4D69YH586XtUaOk1b1dXGQNq6Bih2IiIqKC7OpVoG5dIC4OsLYGfv0VaN9e7qgKNCY3BdjbSy0AXG6BiKjIqVhRSm5evgQ2biySMw5ri8lNAZbdUgsAl1sgItJrN24Ajo6AmZm0HlRwsLTwpbGx3JEVCuxzU4C9udSCvaWJ+lG+lDmXWyAi0lcbN0qjoYYNe11WvDgTGy2w5qYQ4FILRERFwKtXUkKzcqW0ff26VGZqKm9chRBrboiIiOR29SpQp46U2CgU0gKY+/Yxsckl1twUIG93IGbnYSKiImDtWmmhy4QEwM5OWkahRQu5oyrUmNwUINl1IGbnYSIiPfXsGeDnJyU2zZtLiY29vdxRFXpMbgqQNzsQ21pIy9SbqwzZeZiISF+VKCHV3ISFAd9/Dxjyj1ldYHJTALEDMRGRnhICWL0aKFkS+PRTqczbW3qQzjC5ISIiyg/x8VLfmvXrpaHdly9Lc9mQzjG5ISIiymvnzwM+PsC1a1LT09ix7FuTh5jcEBER5RUhgGXLpNW8k5IAJydpkr4GDeSOTK8xuSEiIsoLqalAjx7A5s3Sdrt20qKXNjbyxlUEcBI/IiKivGBkJHUcNjIC5swBdu1iYpNPWHNDRESkK0JIq3cXKyZtz50L9O0LuLvLG1cRw5obIiIiXXj2DPjiC6BjRyBNmrcMJiZMbGTAmps89PZyCu/D5RaIiAqpU6eALl2A27el1btPnwbq1pU7qiKLyU0eym45hffhcgtERIWEEMC8edLQ7tRUoFw5IDgY8PCQO7IijclNHspqOYX34XILRESFxNOnQJ8+wO7d0nbnztKq3lZWsoZFTG7yBZdTICLSQ927A3v3AiqVVHszaBCgUMgdFYHJDRERUe7Mng1ERQFr1gA1a8odDb2Bo6WIiIhy4skTYPv219vVqwNnzzKxKYCY3BAREb3P4cNSEtOlC3Dy5OtyA36NFkT8rRAREWUnLQ2YOhVo2hR4+BD46KPXE/RRgcU+N0RERFl59EhaG2rfPmm7Vy9g0SImN4UAkxsiIqK37d8vjYZ69AgwM5OSmj595I6KcojJDRER0dsuXpQSm6pVpVW9q1SROyLSApMbIiIiQJptOGOemmHDpGUU+vSRam6oUGGHYiIior/+Aho1AuLjpW2FAhgyhIlNIcXkhoiIiq7UVOD774HWrYGjR4GZM+WOiHSAzVJERFQ03b8PdOsmJTWAtHzCjz/KGxPphOw1N4sXL4arqytMTEzg7u6OI0eOvHP/9evX4+OPP4aZmRkcHBzg6+uLmJiYfIqWiIj0wh9/SJPyHT0KWFhIK3kvWQKY5GyRYyrYZE1ugoODMWLECEyYMAHh4eFo2LAh2rZti7t372a5/9GjR9GrVy/069cPly9fxpYtW3D69Gn0798/nyMnIqJCa/VqoH17ICYGqF0bCA8HfHzkjop0SNbkJiAgAP369UP//v1RuXJlBAYGokyZMliyZEmW+588eRIuLi4YNmwYXF1d0aBBAwwcOBBnzpzJ58iJiKjQatcOcHAAvv0WOH4cKF9e7ohIx2RLbpKTkxEWFoZWrVpplLdq1QrHjx/P8hgvLy/cv38fISEhEELg0aNH2Lp1K9q1a5ftdZKSkhAXF6fxICKiIubcudc/29kBly4BCxYAKpVsIVHekS25iY6ORlpaGuzs7DTK7ezsEBUVleUxXl5eWL9+Pbp06QKlUgl7e3sUL14cv/zyS7bXmTFjBqysrNSPMmXK6PR1EBFRAZacDIwYAdSqBWzc+Lrc2lq2kCjvyd6hWJExYdL/E0JkKstw5coVDBs2DBMnTkRYWBj27NmDiIgIDBo0KNvzjx8/HrGxserHvXv3dBo/EREVULduAfXrA/PnS9tXr8obD+Ub2YaClyxZEoaGhplqaR4/fpypNifDjBkzUL9+fXz33XcAgBo1asDc3BwNGzbE1KlT4eDgkOkYlUoFFasdiYiKlq1bgX79gLg4oEQJ4NdfgQ4d5I6K8olsNTdKpRLu7u4IDQ3VKA8NDYWXl1eWxyQkJMDAQDNkQ0NDAFKNDxERFXGJicDQocCXX0qJjZeX1N+GiU2RImuzlJ+fH1auXInVq1fj6tWrGDlyJO7evatuZho/fjx69eql3r9Dhw7Yvn07lixZglu3buHYsWMYNmwY6tSpA0dHR7leBhERFRTHjwOLF0s/jx0LHDwIlC0ra0iU/2SdobhLly6IiYnBlClTEBkZiWrVqiEkJATOzs4AgMjISI05b/r06YP4+HgsXLgQo0aNQvHixdGsWTP8/PPPcr0EIiIqSJo1A6ZOleavadtW7mhIJgpRxNpz4uLiYGVlhdjYWFhaWubptepO34eouETYW5rg5PfN8/RaRERF0qtX0tpQI0YA//+HMeknbb6/ubYUEREVTv/+K80sfPEicPo0cOSItJo3FXmyDwUnIiLS2tq1gLu7lNjY2gKTJjGxITXW3OjQHxciERD6H14mpQEAHscnyhwREZGeefkS+OYbYM0aabtZM+C336TlFIj+H5MbHQoI/Q83n7zMVG6uMpQhGiIiPXPnDuDtDVy5AhgYAP7+wIQJgCE/Y0kTkxsdyqixMVAAthYmAKTEZlSrinKGRUSkH+zsAGNjqZZmwwagSRO5I6ICislNHrC14OgoIiKdePECMDWVamdMTIDt24FixaR+NkTZYIdiIiIqmM6flzoNT536uqxcOSY29F5MboiIqGARAli2DPD0BK5dA1avljoSE+UQkxsiIio44uKAbt2AQYOApCSpA3FYGGBuLndkVIgwuSEiooLh7Flp2YTgYMDICJg9G9i9GyhZUu7IqJBhh2IiIpJfXJw0Z01srLTQZXAwULeu3FFRIcWaGyIikp+lpVRT8+mnQHg4Exv6IExuiIhIHqdOSWtCZejfH9ixA7C2li8m0gtMboiIKH8JAQQEAPXrA19+CTx7JpUrFFwfinSCfW6IiCj/PH0K9OkjdRQGAA8PaSkFIh3iO4qIiPLH8eNAzZpSYqNUAosWAVu2AFZWckdGeobJDRER5a30dGDWLKBRI+DePeCjj4CTJ4EhQ9gMRXmCyQ0REeUthQI4dgxISwO6dpUm5atVS+6oSI+xzw0REeUNIV53Eg4KkpqjevVibQ3lOdbcEBGRbqWnA9OmAb6+UoIDSMO7e/dmYkP5gjU3RESkO48eAT17AqGh0nbv3kDTpvLGREUOa26IiEg39u+XRkOFhgKmptJq3k2ayB0VFUFMboiI6MOkpQGTJgEtWgBRUUCVKsCZM1KzFJuhSAZsliIiog/TsyewcaP0c9++wC+/AGZm8sZERRprboiI6MP06yctfLluHbBqFRMbkh1rboiISDupqcDly8DHH0vbzZsDt28DJUrIGhZRBtbcEBFRzt2/DzRrBjRsCNy48bqciQ0VIExuiIgoZ0JCpNFQR45I228mN0QFCJMbIiJ6t5QUYMwYoF07ICYGqF0bOHsWaNNG7siIssQ+N0RElL27d6X1oE6ckLa/+QaYMwdQqeSNi+gdmNwQEVH2li+XEhsrK2kk1BdfyB0R0XsxuSEiouxNnAhERwNjxwKurnJHQ5Qj7HNDRESvRUQAgwdL/WwAQKkEli5lYkOFSq6Sm9TUVPz9999YtmwZ4uPjAQAPHz7EixcvdBocERHlo23bgFq1pGRm6lS5oyHKNa2bpe7cuYM2bdrg7t27SEpKQsuWLWFhYYFZs2YhMTERS5cuzYs4iYgoryQmAqNHA4sWSdv16kmzDhMVUlrX3AwfPhweHh549uwZTE1N1eWdOnXCvn37dBocERHlsRs3AC+v14nNmDHAoUNA2bLyxkX0AbSuuTl69CiOHTsGpVKpUe7s7IwHDx7oLDAiIspjISHSMO/4eMDGBli7FvD2ljsqog+mdXKTnp6OtLS0TOX379+HhYWFToIiIqJ8UL48kJ4uLaWwYQPg5CR3REQ6oXWzVMuWLREYGKjeVigUePHiBfz9/eHNjJ+IqGB7/vz1zxUrSksp7N/PxIb0itbJzbx583Do0CFUqVIFiYmJ6N69O1xcXPDgwQP8/PPPeREjERHpwm+/Ac7OUp+aDLVqAUac8oz0i9bvaEdHR5w7dw6bNm1CWFgY0tPT0a9fP/To0UOjgzERERUQCQnSsglBQdL28uVA48byxkSUh7RObg4fPgwvLy/4+vrC19dXXZ6amorDhw+jUaNGOg2QiIg+wOXLgI8PcOUKoFAA/v7ADz/IHRVRntK6Wapp06Z4+vRppvLY2Fg0bdpUJ0EREdEHEkKqqfnkEymxsbcH9u2TkhtDQ7mjI8pTWtfcCCGgUCgylcfExMDc3FwnQRER0Qc6cADo21f6uWVLqb+Nra28MRHlkxwnN59//jkAaXRUnz59oHpjufu0tDRcuHABXl5euo+QiIi017Qp0KMHUKUKMG4cYMClBKnoyHFyY2VlBUCqubGwsNDoPKxUKlG3bl0MGDBA9xESEdH7CQGsWwd06ACUKCH1r1m3TvqXqIjJcXIT9P+97F1cXDB69Gg2QRERFRRxccDAgcCmTUCnTtICmAoFExsqsrTuc+Pv758XcRARUW6Eh0ujoW7ckDoK16sn1eIwsaEiLFczN23duhWbN2/G3bt3kZycrPHc2bNndRIYERG9gxDA4sWAnx+QnCwtdLlpk5TcEBVxWvcwW7BgAXx9fWFra4vw8HDUqVMHNjY2uHXrFtq2bZsXMRIR0ZuePwe+/FKamC85GejYUarBYWJDBCAXyc3ixYuxfPlyLFy4EEqlEmPGjEFoaCiGDRuG2NjYvIiRiIjelJYGnDoFGBsD8+YBO3cC1tZyR0VUYGjdLHX37l31kG9TU1PEx8cDAHr27Im6deti4cKFuo2QiIikZihA6ktjYwNs2SIN7/7kE3njIiqAtK65sbe3R0xMDADA2dkZJ0+eBABERERAZPznIyIi3Xn6FPjss9drQwGApycTG6JsaJ3cNGvWDLt37wYA9OvXDyNHjkTLli3RpUsXdOrUSecBEhEVaSdOSCt379oFjBolDfsmonfSullq+fLlSE9PBwAMGjQI1tbWOHr0KDp06IBBgwbpPEAioiIpPR2YOxf4/nsgNRUoXx7YvBmwtJQ7MqICT+vkxsDAAAZvTOPt4+MDHx8fAMCDBw9QunRp3UVHRFQURUcDvXsDISHSdpcuwPLlTGyIckgni41ERUXh22+/xUcffaT1sYsXL4arqytMTEzg7u6OI0eOvHP/pKQkTJgwAc7OzlCpVChfvjxWr16d29CJiAqWFy8Ad3cpsVGpgGXLgI0bmdgQaSHHyc3z58/Ro0cPlCpVCo6OjliwYAHS09MxceJElCtXDidPntQ6yQgODsaIESMwYcIEhIeHo2HDhmjbti3u3r2b7TE+Pj7Yt28fVq1ahf/++w8bN25EpUqVtLouEVGBVayYVGtTsaI03PvrrznbMJGWFCKHQ5yGDBmC3bt3o0uXLtizZw+uXr2K1q1bIzExEf7+/mjcuLHWF/f09ETt2rWxZMkSdVnlypXx2WefYcaMGZn237NnD7p27Ypbt27BOpdzOsTFxcHKygqxsbGw1PFfQnWn70NUXCLsLU1w8vvmOj03Eemxx4+BhATAxUXaTk0FEhOlRIeIAGj3/Z3jmps//vgDQUFBmDNnDnbt2gUhBNzc3LB///5cJTbJyckICwtDq1atNMpbtWqF48ePZ3nMrl274OHhgVmzZqF06dJwc3PD6NGj8erVq2yvk5SUhLi4OI0HEVGBceAA8PHHwBdfAElJUpmRERMbog+Q4+Tm4cOHqFKlCgCgXLlyMDExQf/+/XN94ejoaKSlpcHOzk6j3M7ODlFRUVkec+vWLRw9ehSXLl3Cjh07EBgYiK1bt2Lo0KHZXmfGjBmwsrJSP8qUKZPrmImIdCYtDZg8GWjRAoiKkmpqHj+WOyoivZDj5CY9PR3GxsbqbUNDQ5ibm39wAIq32pKFEJnK3oxBoVBg/fr1qFOnDry9vREQEIA1a9ZkW3szfvx4xMbGqh/37t374JiJiD5IZCTQqhUwaZI05NvXV+pfwz++iHQix0PBhRDo06cPVCoVACAxMRGDBg3KlOBs3749R+crWbIkDA0NM9XSPH78OFNtTgYHBweULl0aVlZW6rLKlStDCIH79++jQoUKmY5RqVTqmImIZBcaCnz1lVRLY24OLFkC9Owpd1REeiXHNTe9e/eGra2tunnnq6++gqOjo0aTz5tJx/solUq4u7sjNDRUozw0NFS9dtXb6tevj4cPH+LFixfqsmvXrsHAwABOTk45vjYRkSyEACZOlBKb6tWBM2eY2BDlgRzX3AS9uaaJjvj5+aFnz57w8PBAvXr1sHz5cty9e1c90/H48ePx4MEDrF27FgDQvXt3/PTTT/D19cXkyZMRHR2N7777Dn379oWpqanO4yMi0imFAtiwAZg/H5gxA+DnFlGe0HqGYl3q0qULYmJiMGXKFERGRqJatWoICQmBs7MzACAyMlJjzptixYohNDQU3377LTw8PGBjYwMfHx9MnTpVrpdARPRuf/4JnD8PjBsnbbu6AoGBsoZEpO9yPM+NvuA8N0SUL1JSgB9+AGbNkrYPHgRyMW0GEUm0+f6WteaGiEgv3b0LdO0qregNAEOHAp6e8sZEVIQwuSEi0qVdu4A+fYBnzwArK2DVKmmCPiLKNzpZOJOIiCA1Q336qZTYfPIJcPYsExsiGeQquVm3bh3q168PR0dH3LlzBwAQGBiI//3vfzoNjoioUKlYUfp3xAjg6FGgXDlZwyEqqrRObpYsWQI/Pz94e3vj+fPnSEtLAwAUL14cgRwBQERFzbNnr3/u2RMICwPmzQOUSvliIiritE5ufvnlF6xYsQITJkyAoaGhutzDwwMXL17UaXBERAVWUhLw7bfSZHxPnrwur11bvpiICEAukpuIiAjUqlUrU7lKpcLLly91EhQRUYF24wbg5QUsXAg8eAD88YfcERHRG7ROblxdXXHu3LlM5X/++ad61XAiIr21ebNUO3P2LGBjA/z+uzQ6iogKDK2Hgn/33XcYOnQoEhMTIYTAqVOnsHHjRsyYMQMrV67MixiJiOT36hUwciSwbJm03aABsHEjwHXtiAocrZMbX19fpKamYsyYMUhISED37t1RunRpzJ8/H127ds2LGImI5DdlipTYKBTA+PHA5MmAEacKIyqIcvU/c8CAARgwYACio6ORnp4OW1tbXcdFRFSwjBsHHDoETJoEtGoldzRE9A5a97mZPHkybt68CQAoWbIkExsi0k8JCcCSJUDG8ntWVsCxY0xsiAoBrZObbdu2wc3NDXXr1sXChQvx5M0hkERE+uDKFaBOHWDIEGDx4tflCoV8MRFRjmmd3Fy4cAEXLlxAs2bNEBAQgNKlS8Pb2xsbNmxAQkJCXsRIRJR/1qyRlk64fBmwtwcqV5Y7IiLSUq6WX6hatSqmT5+OW7du4cCBA3B1dcWIESNgb2+v6/iIiPLHixdA796Ar6/UJNWiBXDuHNCsmdyREZGWPnjhTHNzc5iamkKpVCIlJUUXMRER5a+LF6XamrVrAQMDYOpUYO9ewM5O7siIKBdyldxERERg2rRpqFKlCjw8PHD27FlMmjQJUVFRuo6PiCjvxcYC168Djo7AgQPAhAlSkkNEhZLWQ8Hr1auHU6dOoXr16vD19VXPc0NEVKgI8bqDcIMGwKZNQOPGQKlS8sZFRB9M6+SmadOmWLlyJapWrZoX8RAR5b3wcKBvX2D9eiBj2ZjOneWNiYh0Rut61+nTpzOxIaLCSQhpaHfdulJn4VGj5I6IiPJAjmpu/Pz88NNPP8Hc3Bx+fn7v3DcgIEAngRER6VRsLNC/P7B1q7TdoQMQFCRvTESUJ3KU3ISHh6tHQoWHh+dpQEREOnfmDODjA0REAMbGwM8/AyNGcFI+Ij2Vo+TmwIEDWf5MRFTgnTghdRROSQFcXIDgYGn2YSLSW1r3uenbty/i4+Mzlb98+RJ9+/bVSVBERDrzySdSH5vPP5c6EjOxIdJ7Wic3v/76K169epWp/NWrV1i7dq1OgiIi+iBnzwJJSdLPRkbAH39IfW2KF5c1LCLKHzlObuLi4hAbGwshBOLj4xEXF6d+PHv2DCEhIVwhnIjklZ4OzJkDeHoCY8a8LrewYP8aoiIkx/PcFC9eHAqFAgqFAm5ubpmeVygUmDx5sk6DIyLKsehooE8fqZYGAB49AtLSAENDWcMiovyX4+TmwIEDEEKgWbNm2LZtG6ytrdXPKZVKODs7w9HRMU+CJCJ6p6NHga5dgQcPAJUKmD8f+Ppr1tYQFVE5Tm4aN24MQFpXqmzZslDwQ4OI5JaeLg3r/vFHqZbGzQ3YvBn4+GO5IyMiGeUoublw4QKqVasGAwMDxMbG4uLFi9nuW6NGDZ0FR0T0Tg8fAjNnSolNjx7AkiVS/xoiKtJylNzUrFkTUVFRsLW1Rc2aNaFQKCCEyLSfQqFAWlqazoMkIsqSkxOwZg3w7Bng68tmKCICkMPkJiIiAqX+f6XciIiIPA2IiChbaWnA9OnSXDWtW0tlnTrJGxMRFTg5Sm6cnZ2z/JmIKN9ERUlNT/v3AyVLAteuASVKyB0VERVAuZrE74+MoZYAxowZg+LFi8PLywt37tzRaXBERACAv/+WOgnv3w+YmwMBAUxsiChbWic306dPh6mpKQDgxIkTWLhwIWbNmoWSJUti5MiROg+QiIqw1FRpJFSrVsDjx0D16tIimD17yh0ZERVgOR4KnuHevXv46KOPAAA7d+5E586d8fXXX6N+/fpo0qSJruMjoqIqIQFo2xY4fFja/vprIDAQ+P8/roiIsqN1zU2xYsUQExMDAPjrr7/QokULAICJiUmWa04REeWKmRng6goUKwZs3AgsW8bEhohyROuam5YtW6J///6oVasWrl27hnbt2gEALl++DBcXF13HR0RFSUqKVGNjZSVtL1oE/PAD8P+1xUREOaF1zc2iRYtQr149PHnyBNu2bYONjQ0AICwsDN26ddN5gERURNy7BzRpAnTrJs08DEidh5nYEJGWtK65KV68OBYuXJipnItmElGu7d4tLXr59ClgaSkN865USe6oiKiQ0jq5AYDnz59j1apVuHr1KhQKBSpXrox+/frBKqMqmYgoJ5KTgfHjpaHdAODhAQQHA+XKyRsXERVqWjdLnTlzBuXLl8e8efPw9OlTREdHY968eShfvjzOnj2bFzESkT66fRto2PB1YjNihLS6NxMbIvpAWtfcjBw5Eh07dsSKFStgZCQdnpqaiv79+2PEiBE4nDFsk4goO0IAnTsDYWFA8eLS+lCffip3VESkJ3JVczN27Fh1YgMARkZGGDNmDM6cOaPT4IhITykUwNKlQKNGwLlzTGyISKe0Tm4sLS1x9+7dTOX37t2DhYWFToIiIj108yawdevrbQ8P4OBBgOvVEZGOaZ3cdOnSBf369UNwcDDu3buH+/fvY9OmTejfvz+HghNR1rZsAWrXlha+DA9/Xa5QyBcTEektrfvczJkzBwqFAr169UJqaioAwNjYGIMHD8bMmTN1HiARFWKJiYCfH7BkibTdoAFQqpS8MRGR3tM6uVEqlZg/fz5mzJiBmzdvQgiBjz76CGZmZnkRHxEVVteuAT4+wPnzUg3N+PHA5MmAUa5moCAiyrEcN0slJCRg6NChKF26NGxtbdG/f384ODigRo0aTGyISNOGDVIz1PnzUk3Nnj3AtGlMbIgoX+Q4ufH398eaNWvQrl07dO3aFaGhoRg8eHBexkZEhdXt28DLl9JyCufOAa1ayRwQERUlOf4zavv27Vi1ahW6du0KAPjqq69Qv359pKWlwdDQMM8CJKJCIj0dMPj/v5fGjQMcHYGePQF+PhBRPstxzc29e/fQsGFD9XadOnVgZGSEhw8f5klgRFSI/Por4OUlregNSElOnz5MbIhIFjlObtLS0qBUKjXKjIyM1COmiKgIevkS6N1bSmT++QdYtkzuiIiIct4sJYRAnz59oFKp1GWJiYkYNGgQzM3N1WXbt2/XbYREVDBdvCiNhvr3X6mmZsoUYNgwuaMiIsp5ctO7d+9MZV999ZVOgyGiQkAIYNUq4NtvpXlsHB2BjRulpRSIiAqAHCc3QUFBeRkHERUWM2cC338v/dy2rdTfhhPzEVEBovXyC7q2ePFiuLq6wsTEBO7u7jhy5EiOjjt27BiMjIxQs2bNvA2QiDT17AnY2wM//wz8/jsTGyIqcGRNboKDgzFixAhMmDAB4eHhaNiwIdq2bZvlwpxvio2NRa9evdC8efN8ipSoCBMCOHbs9baTE3D9OjBmzOuh30REBYisn0wBAQHo168f+vfvj8qVKyMwMBBlypTBkox1aLIxcOBAdO/eHfXq1cunSImKqNhYqdNwgwbA//73urxYMfliIiJ6D9mSm+TkZISFhaHVWzOXtmrVCsePH8/2uKCgINy8eRP+/v55HSJR0XbmjLSEwtatgLExEBkpd0RERDki20Iv0dHRSEtLg52dnUa5nZ0doqKisjzm+vXrGDduHI4cOQKjHK5Rk5SUhKSkJPV2XFxc7oMmKgqEABYsAL77DkhJAVxcgOBgoE4duSMjIsqRXNXcrFu3DvXr14ejoyPu3LkDAAgMDMT/3qy2ziGFQqGxLYTIVAZIkwh2794dkydPhpubW47PP2PGDFhZWakfZcqU0TpGoiLj2TPg88+BESOkxObzz4HwcCY2RFSoaJ3cLFmyBH5+fvD29sbz58+RlpYGAChevDgCAwNzfJ6SJUvC0NAwUy3N48ePM9XmAEB8fDzOnDmDb775BkZGRjAyMsKUKVNw/vx5GBkZYf/+/VleZ/z48YiNjVU/7t27l/MXS1TUHD4M7NwJKJXAL79ITVLFi8sdFRGRVrRObn755ResWLECEyZM0Fgw08PDAxcvXszxeZRKJdzd3REaGqpRHhoaCi8vr0z7W1pa4uLFizh37pz6MWjQIFSsWBHnzp2Dp6dnltdRqVSwtLTUeBBRNj79FJg6FTh+HPjmGyCLWlQiooJO6z43ERERqFWrVqZylUqFly9fanUuPz8/9OzZEx4eHqhXrx6WL1+Ou3fvYtCgQQCkWpcHDx5g7dq1MDAwQLVq1TSOt7W1hYmJSaZyIsqhmBhg1ChgxgzAwUEqmzBB3piIiD6Q1smNq6srzp07B2dnZ43yP//8E1WqVNHqXF26dEFMTAymTJmCyMhIVKtWDSEhIepzR0ZGvnfOGyLKpWPHgK5dgfv3gcePgZAQuSMiItIJrZOb7777DkOHDkViYiKEEDh16hQ2btyIGTNmYOXKlVoHMGTIEAwZMiTL59asWfPOYydNmoRJkyZpfU2iIi09HZg1C/jhByAtDXBzk2puiIj0hNbJja+vL1JTUzFmzBgkJCSge/fuKF26NObPn4+uXbvmRYxEpCtPngC9egF79kjbPXoAS5YAFhbyxkVEpEO5mudmwIABGDBgAKKjo5Geng5bW1tdx0VEunbpEtC6NfDwIWBqCixcCPj6stMwEemdD5rEr2TJkrqKg4jymosLYGkJWFkBmzcD7IhPRHoqVx2Ks5pkL8OtW7c+KCAi0qGYGKBECWmBy2LFpE7DtraAubnckRER5Rmtk5sRI0ZobKekpCA8PBx79uzBd999p6u4iOhD7dsn9akZPVp6AICrq7wxERHlA62Tm+HDh2dZvmjRIpw5c+aDAyKiD5SWBkyeLE3GJwSwYYO0nEIO12MjIirsdLYqeNu2bbFt2zZdnY6IcuPhQ6B5c+Cnn6TEZsAAaT4bJjZEVITo7BNv69atsLa21tXpiEhbe/cCX30FREdL/WuWLwe6dZM7KiKifKd1clOrVi2NDsVCCERFReHJkydYvHixToMjohyKjJTWhUpKAmrWBIKDpcn5iIiKIK2Tm88++0xj28DAAKVKlUKTJk1QqVIlXcVFRNpwcAB+/hm4dg2YOxcwMZE7IiIi2WiV3KSmpsLFxQWtW7eGvb19XsVERDnxxx9A6dJSTQ0AZNPZn4ioqNGqQ7GRkREGDx6MpKSkvIqHiN4nOVka2t2+PeDjA8THyx0REVGBovVoKU9PT4SHh+dFLET0PrdvA40aSU1PANCuHaBUyhoSEVFBo3WfmyFDhmDUqFG4f/8+3N3dYf7WTKc1atTQWXBE9IadO6W1oJ4/B4oXB9askToRExGRhhwnN3379kVgYCC6dOkCABg2bJj6OYVCASEEFAoF0tLSdB8lUVGWkiI1Qy1YIG3XrQts2gQ4O8sbFxFRAZXj5ObXX3/FzJkzERERkZfxENHbDAyAK1ekn0ePBqZPB4yN5Y2JiKgAy3FyI4QAADjzr0Wi/JGeLiU2hobAb78BYWGAt7fcURERFXhadSh+12rgRKQjiYnAkCHA4MGvy+zsmNgQEeWQVh2K3dzc3pvgPH369IMCIirSrl+XhnefOydtDx0KsJM+EZFWtEpuJk+eDCsrq7yKhaho27gR+Ppr4MULoFQpYN06JjZERLmgVXLTtWtX2Nra5lUsREXTq1fAsGHAypXSdpMmwPr1gKOjrGERERVWOU5u2N+GKA8IIfWlOXgQUCiAH38EJk6UOhETEVGuaD1aioh0SKGQhnf/9580IqpZM7kjIiIq9HKc3KSnp+dlHERFx8uXwNWrgIeHtN2undSR+K3ZvomIKHe0XluKiD7ApUvAJ58ArVoBd+68LmdiQ0SkM0xuiPKDEMCqVUCdOlKtjakp8OiR3FEREeklJjdEeS0+HujZE+jfXxoZ1aaNNI9NnTpyR0ZEpJeY3BDlpXPnpL4169dLI6BmzgT++EOax4aIiPKEVvPcEJGWVq0Crl0DnJyklbzr15c7IiIivcfkhigvzZ4treA9YQJgYyN3NERERQKbpYh0KSwM6NcPSEuTtk1MgIAAJjZERPmIyQ2RLggB/PIL4OUFrF4NzJ8vd0REREUWm6WIPtSzZ1JtzY4d0vZnnwG+vrKGRERUlLHmhuhDnDoF1K4tJTZKJbBgAbB9O1CihNyREREVWay5IcqttWulGpvUVKBcOWDzZsDdXe6oiIiKPNbcEOVWzZqAkRHg4wOcPcvEhoiogGDNDZE2Hj8GbG2ln2vUkJKaSpWk1b2JiKhAYM0NUU6kpwM//wy4uAD//PO6vHJlJjZERAUMkxui93nyBGjXDhg3TlobautWuSMiIqJ3YLMU0bscPgx06wY8fChNyLdwIdC3r9xRERHRO7DmhigraWnA1KlA06ZSYlO5MnD6tDQ6is1QREQFGpMboqxs2wb8+KPU16Z3bymxqVZN7qiIiCgH2CxFlJUvvwR27gRat5aSGyIiKjRYc0MESM1Q8+YB8fHStkIBbNjAxIaIqBBickP08CHQvDng5wcMHix3NERE9IGY3FDRtnevNNPwoUNAsWKAt7fcERER0QdickNFU2oqMH480KaNNI/Nxx8DYWFA9+5yR0ZERB+IHYqp6HnwAOjSBTh2TNoeMgSYO1eax4aIiAo9JjdU9BgaAjduAJaWwMqV0sgoIiLSG0xuqGhIS5OSGgCwtwe2bwfs7IDy5eWNi4iIdI59bkj/3b4N1K8PBAe/LvPyYmJDRKSnmNyQftu5E6hVS1rJe8wYIDlZ7oiIiCiPMbkh/ZScDIwYAXTqBDx/DtSpIw33VirljoyIiPIYkxvSP7duSc1Q8+dL26NGAUeOAC4usoZFRET5gx2KSb88fgzUrg3ExgLW1sCaNUCHDnJHRURE+YjJDekXW1ugXz/g5Elg0yagTBm5IyIionwme7PU4sWL4erqChMTE7i7u+PIkSPZ7rt9+3a0bNkSpUqVgqWlJerVq4e9e/fmY7RUIF2/Dty9+3p75kzg4EEmNkRERZSsyU1wcDBGjBiBCRMmIDw8HA0bNkTbtm1x980vqjccPnwYLVu2REhICMLCwtC0aVN06NAB4eHh+Rw5FRgbN0rNUN26ASkpUpmxsfQgIqIiSSGEEHJd3NPTE7Vr18aSJUvUZZUrV8Znn32GGTNm5OgcVatWRZcuXTBx4sQc7R8XFwcrKyvExsbC0tIyV3Fnp+70fYiKS4S9pQlOft9cp+emt7x6BQwfDqxYIW03bixNzGdtLW9cRESUJ7T5/pat5iY5ORlhYWFo1aqVRnmrVq1w/PjxHJ0jPT0d8fHxsOYXWtHy77/S0O4VKwCFAvjxR+Dvv5nYEBERABk7FEdHRyMtLQ12dnYa5XZ2doiKisrROebOnYuXL1/Cx8cn232SkpKQlJSk3o6Li8tdwFQwrF0LDB4MJCRIyyf89hvQooXcURERUQEie4dihUKhsS2EyFSWlY0bN2LSpEkIDg6Gra1ttvvNmDEDVlZW6kcZdjItvJKTpdW7ExKA5s2Bc+eY2BARUSayJTclS5aEoaFhplqax48fZ6rNeVtwcDD69euHzZs3o8V7vtzGjx+P2NhY9ePevXsfHDvJRKkENm8Gpk0D9u6VFsAkIiJ6i2zJjVKphLu7O0JDQzXKQ0ND4eXlle1xGzduRJ8+fbBhwwa0a9fuvddRqVSwtLTUeFAhIQSwahUwa9brsooVge+/f73CNxER0VtkncTPz88PPXv2hIeHB+rVq4fly5fj7t27GDRoEACp1uXBgwdYu3YtACmx6dWrF+bPn4+6deuqa31MTU1hZWUl2+ugPBAfL/WtWb8eMDCQmp9q15Y7KiIiKgRkTW66dOmCmJgYTJkyBZGRkahWrRpCQkLg7OwMAIiMjNSY82bZsmVITU3F0KFDMXToUHV57969sWbNmvwOn/LK+fOAjw9w7ZpUQzN1KlCzptxRERFRISHrPDdy4Dw3BZgQwPLl0vw1SUmAk5M0SV+DBnJHRkREMtPm+5trS1HB0bevtNAlALRvL/1sYyNnREREVAjJPhScSK1uXcDICJgzB9i1i4kNERHlCmtuSD5CAI8evR7S/fXXQJMm0ogoIiKiXGLNDcnj2TPgiy+AevWA58+lMoWCiQ0REX0wJjeU//75RxrWvWMH8OABcOyY3BEREZEeYXJD+UcIICBAGv10+zZQrhxw/DiQg8kYiYiIcop9bih/xMQAffoAv/8ubXfuDKxcCXDyRSIi0jHW3FD+GDdOSmxUKmDxYmmNKCY2RESUB1hzQ/lj5kwgIkIa5s3ZhomIKA+x5obyxpMnwLx5Uj8bQJqz5u+/mdgQEVGeY80N6d7hw0C3bsDDh1LTU9++ckdERERFCGtuSHfS0qRFLps2lRKbSpWATz6ROyoiIipiWHNDuvHoEfDVV1LTEwD06gUsWgQUKyZvXEREVOQwuaEPd/Ag0LWrlOCYmUlJTZ8+ckdFRERFFJMb+nCpqcDjx0DVqtIQ7ypV5I6IiIiKMCY3lDupqdIK3gDQooW0lELLllLNDRERkYzYoZi0t3cvULkycPPm67JPP2ViQ0REBQKTG8q51FTg+++BNm2AGzeAKVPkjoiIiCgTNktRzty/L81dc/SotD1okLQIJhERUQHD5Ibe748/gN69pcUvLSykBS99fOSOioiIKEtMbujdfv8d6NBB+rl2bSA4GPjoI3ljIiIiegcmN/RurVoBdeoAnp7A7NnSqt5EREQFGJMbyuzAAaBBA8DYGFAqgUOHABMTuaMiIiLKEY6WoteSk4ERI4BmzQB//9flTGyIiKgQYc0NSW7dArp0Ac6ckbZTUgAhAIVC3riIiIi0xOSGgK1bgX79gLg4wNoaWLPmdSdiIiKiQobNUkVZYiIwdCjw5ZdSYuPlBYSHM7EhIqJCjclNUXbvHvDrr9LPY8dKq3uXLStrSERERB+KzVJFWYUKwOrV0sR8bdvKHQ0REZFOsOamKHn1Slo24fDh12U+PkxsiIhIr7Dmpqj4918pkbl4UVpO4fp1DvEmIiK9xJqbomDtWsDdXUpsbG2lpigmNkREpKeY3Oizly8BX19p0cuEBGlyvnPngJYt5Y6MiIgoz7BZSl89fQo0bAhcuQIYGEgzDk+YABgayh0ZERFRnmJyo69KlACqVgWePQM2bACaNJE7IiIionzB5EafvHgBpKUBVlbSsgkrVgBJSVI/GyIioiKCfW70xfnzUqfhfv2kNaEAKclhYkNEREUMk5vCTghg2TLA0xO4dg04eRKIjJQ7KiIiItkwuSnM4uKAbt2kifmSkoB27aTRUI6OckdGREQkGyY3hdXZs0Dt2kBwMGBkBMyeDezaBZQsKXdkREREsmKH4sIoNVWabfjmTWmhy+BgoG5duaMiIiIqEFhzUxgZGQFr1gBffAGEhzOxISIiegNrbgqLU6eAu3eBzp2l7QYNpAcRERFpYM1NQScEMG+elMj07i3NOExERETZYs1NQfb0KdCnD7B7t7TdsSNHQhEREb0Hk5uC6vhxoGtX4N49QKmUam8GD5ZmHiaifCWEQGpqKtLS0uQOhUivGRsbw1AHayAyuSmI5swBxo2TllL46CNg82agVi25oyIqkpKTkxEZGYmEhAS5QyHSewqFAk5OTihWrNgHnYfJTUH0/LmU2HTtKs0+bGkpd0RERVJ6ejoiIiJgaGgIR0dHKJVKKFh7SpQnhBB48uQJ7t+/jwoVKnxQDQ6Tm4IiNVUa4g0AkyZJ60R99hmboYhklJycjPT0dJQpUwZmZmZyh0Ok90qVKoXbt28jJSXlg5IbjpaSW3o6MG2aNBoqKUkqMzICOnViYkNUQBgY8KOSKD/oqmaU/2Pl9OgR0KYN8MMPwD//AFu2yB0RERFRocfkRi779wM1awKhoYCpKbB6NdCjh9xRERERFXpMbvJbWprUp6ZFCyAqCqhSBThzBvD1ZTMUEZHMYmJiYGtri9u3b8sdit5ZuHAhOnbsmC/XYnKT3/z8gMmTpZmH+/YFTp+WEhwiIh3p06cPFAoFFAoFjIyMULZsWQwePBjPnj3LtO/x48fh7e2NEiVKwMTEBNWrV8fcuXOznNPnwIED8Pb2ho2NDczMzFClShWMGjUKDx48yI+XlS9mzJiBDh06wMXFRe5Q8syhQ4fg7u4OExMTlCtXDkuXLn3vMfv27YOXlxcsLCzg4OCAsWPHIjU1VWOfzZs3o2bNmjAzM4OzszNmz56t8fyAAQNw+vRpHD16VKevJytMbvLb8OFA6dLAunXAqlUAR2AQUR5o06YNIiMjcfv2baxcuRK7d+/GkCFDNPbZsWMHGjduDCcnJxw4cAD//vsvhg8fjmnTpqFr164QQqj3XbZsGVq0aAF7e3ts27YNV65cwdKlSxEbG4u5c+fm2+tKTk7Os3O/evUKq1atQv/+/T/oPHkZ44eKiIiAt7c3GjZsiPDwcHz//fcYNmwYtm3blu0xFy5cgLe3N9q0aYPw8HBs2rQJu3btwrhx49T7/Pnnn+jRowcGDRqES5cuYfHixQgICMDChQvV+6hUKnTv3h2//PJLnr5GAIAoYmJjYwUAERsbq/Nze077WziP/V14Tvv7dWFKihB//aW5Y2Kizq9NRLr36tUrceXKFfHq1Su5Q9FK7969xaeffqpR5ufnJ6ytrdXbL168EDY2NuLzzz/PdPyuXbsEALFp0yYhhBD37t0TSqVSjBgxIsvrPXv2LNtYnj17JgYMGCBsbW2FSqUSVatWFbt37xZCCOHv7y8+/vhjjf3nzZsnnJ2dM72W6dOnCwcHB+Hs7CzGjRsnPD09M12revXqYuLEiert1atXi0qVKgmVSiUqVqwoFi1alG2cQgixbds2UbJkSY2y1NRU0bdvX+Hi4iJMTEyEm5ubCAwM1NgnqxiFEOL+/fvCx8dHFC9eXFhbW4uOHTuKiIgI9XGnTp0SLVq0EDY2NsLS0lI0atRIhIWFvTPGDzVmzBhRqVIljbKBAweKunXrZnvM+PHjhYeHh0bZjh07hImJiYiLixNCCNGtWzfRuXNnjX3mzZsnnJycRHp6urrs4MGDQqlUioSEhCyv9a7/c9p8f3Oem7x0/z7QvTtw9CiwZw/QqpVUrlLJGxcR5VqHX47iSXxSvl+3lIUKu79tkKtjb926hT179sDY2Fhd9tdffyEmJgajR4/OtH+HDh3g5uaGjRs3okuXLtiyZQuSk5MxZsyYLM9fvHjxLMvT09PRtm1bxMfH47fffkP58uVx5coVrecv2bdvHywtLREaGqquTZo5cyZu3ryJ8uXLAwAuX76MixcvYuvWrQCAFStWwN/fHwsXLkStWrUQHh6OAQMGwNzcHL17987yOocPH4aHh0em1+Dk5ITNmzejZMmSOH78OL7++ms4ODjAx8cn2xgTEhLQtGlTNGzYEIcPH4aRkRGmTp2KNm3a4MKFC1AqlYiPj0fv3r2xYMECAMDcuXPh7e2N69evw8LCIssY169fj4EDB77zfi1btgw9shmgcuLECbTK+C76f61bt8aqVauQkpKi8R7JkJSUBBMTE40yU1NTJCYmIiwsDE2aNEFSUlKmuaBMTU1x//593LlzR93M5+HhgZSUFJw6dQqNGzd+5+v4ELInN4sXL8bs2bMRGRmJqlWrIjAwEA0bNsx2/0OHDsHPzw+XL1+Go6MjxowZg0GDBuVjxDkUEgL06gXExAAWFsDLl3JHREQ68CQ+CVFxiXKH8V6///47ihUrhrS0NCQmSvEGBASon7927RoAoHLlylkeX6lSJfU+169fh6WlJRwcHLSK4e+//8apU6dw9epVuLm5AQDKlSun9WsxNzfHypUroVQq1WU1atTAhg0b8OOPPwKQvvQ/+eQT9XV++uknzJ07F59//jkAwNXVFVeuXMGyZcuyTW5u374Nx7cWJzY2NsbkyZPV266urjh+/Dg2b96skdy8HePq1athYGCAlStXquduCQoKQvHixXHw4EG0atUKzZo107jWsmXLUKJECRw6dAjt27fPMsaOHTvC09PznffLzs4u2+eioqIyPW9nZ4fU1FRER0dn+Ttu3bo1AgMDsXHjRvj4+CAqKgpTp04FAERGRqr3GTlyJPr06YOmTZvixo0bCAwMVO+TkdyYm5ujePHiuH37tv4mN8HBwRgxYgQWL16M+vXrY9myZWjbti2uXLmCsmXLZto/o61wwIAB+O2333Ds2DEMGTIEpUqVwhdffCHDK8jMKC0V3+xZDkzYLBXUrg0EB0trRBFRoVfKQp6aV22v27RpUyxZsgQJCQlYuXIlrl27hm+//TbTfuKNfjVvl2d8Kb/5szbOnTsHJycndcKRW9WrV9dIbACgR48eWL16NX788UcIIbBx40aMGDECAPDkyRPcu3cP/fr1w4ABA9THpKamwsrKKtvrvHr1KlMNBQAsXboUK1euxJ07d/Dq1SskJyejZs2a74wxLCwMN27cyFQDk5iYiJs3bwIAHj9+jIkTJ2L//v149OgR0tLSkJCQgLt372Ybo4WFRba1Ojn19u8y4z2Q3e+4VatWmD17NgYNGoSePXtCpVLhxx9/xNGjR9W1cAMGDMDNmzfRvn17pKSkwNLSEsOHD8ekSZMy1dSZmprm+VptsiY3AQEB6Nevn7rzVmBgIPbu3YslS5ZgxowZmfZfunQpypYtq84GK1eujDNnzmDOnDkFIrmxf/YIizdMQe2H/0kF334LzJ7NZigiPZLbpqH8Zm5ujo/+/4+qBQsWoGnTppg8eTJ++uknAFAnHFevXoWXl1em4//9919U+f+RnG5uboiNjUVkZKRWtTempqbvfN7AwCBTcpWSkpLla3lb9+7dMW7cOJw9exavXr3CvXv30LVrVwBSUxIgNU29XcvxriaxkiVLZhpRtnnzZowcORJz585FvXr1YGFhgdmzZ+Off/55Z4zp6elwd3fH+vXrM12nVKlSAKRRbU+ePEFgYCCcnZ2hUqlQr169d3ZI/tBmKXt7e0RFRWmUPX78GEZGRrCxscn2nH5+fhg5ciQiIyNRokQJ3L59G+PHj4erqysAKTH6+eefMX36dERFRaFUqVLYt28fAGQaefb06VP1PcgrsiU3ycnJCAsL0+htDUgZ4vHjx7M8JrdthUlJr9vH4+LidBB91mrevoDaD/9DvIk5LNavBf6/OpSISG7+/v5o27YtBg8eDEdHR7Rq1QrW1taYO3dupuRm165duH79ujoR6ty5M8aNG4dZs2Zh3rx5mc79/PnzLPvd1KhRA/fv38e1a9eyrL0pVaoUoqKiNGqGzp07l6PX4+TkhEaNGmH9+vV49eoVWrRooW5usbOzQ+nSpXHr1q1sv+SzUqtWLfz2228aZUeOHIGXl5fGSLOMmpd3qV27NoKDg2FrawvLbBY/PnLkCBYvXgxvb28AwL179xAdHf3O835os1S9evWwe/dujbK//voLHh4eWX6HvkmhUKib7TZu3IgyZcqgdu3aGvsYGhqidOnS6n3q1asHW1tb9fM3b95EYmIiatWq9c5rfbD3djnOIw8ePBAAxLFjxzTKp02bJtzc3LI8pkKFCmLatGkaZceOHRMAxMOHD7M8xt/fXwDI9Mir0VI/N+olPhu1TufnJqL8p0+jpYQQwt3dXQwdOlS9vWXLFmFoaCgGDBggzp8/LyIiIsTKlStFiRIlROfOnTVGuSxatEgoFArRt29fcfDgQXH79m1x9OhR8fXXXws/P79sY2nSpImoVq2a+Ouvv8StW7dESEiI+PPPP4UQQly5ckUoFAoxc+ZMcePGDbFw4UJRokSJLEdLZWX58uXC0dFRlCxZUqxbp/m5u2LFCmFqaioCAwPFf//9Jy5cuCBWr14t5s6dm22sFy5cEEZGRuLp06fqssDAQGFpaSn27Nkj/vvvP/HDDz8IS0tLjVFeWcX48uVLUaFCBdGkSRNx+PBhcevWLXHw4EExbNgwce/ePSGEEDVr1hQtW7YUV65cESdPnhQNGzYUpqamYt68ednG+KFu3bolzMzMxMiRI8WVK1fEqlWrhLGxsdi6dat6n+3bt4uKFStqHDdr1ixx4cIFcenSJTFlyhRhbGwsduzYoX7+yZMnYsmSJeLq1asiPDxcDBs2TJiYmIh//vlH4zxBQUGiXLly2canq9FSsic3x48f1yifOnVqppuaoUKFCmL69OkaZUePHhUARGRkZJbHJCYmitjYWPXj3r17eZbctF9wRHhO+1u0X3BE5+cmovynb8nN+vXrhVKpFHfv3lWXHT58WLRp00ZYWVkJpVIpqlSpIubMmSNSU1MzHR8aGipat24tSpQoIUxMTESlSpXE6NGjs/3jUgghYmJihK+vr7CxsREmJiaiWrVq4vfff1c/v2TJElGmTBlhbm4uevXqJaZNm5bj5ObZs2dCpVIJMzMzER8fn+XrrVmzplAqlaJEiRKiUaNGYvv27dnGKoQQdevWFUuXLlVvJyYmij59+ggrKytRvHhxMXjwYDFu3Lj3JjdCCBEZGSl69eolSpYsKVQqlShXrpwYMGCA+vvn7NmzwsPDQ6hUKlGhQgWxZcsW4ezsnKfJjRDScOxatWoJpVIpXFxcxJIlSzSeDwoKEm/XfTRt2lRYWVkJExMT4enpKUJCQjSef/Lkiahbt64wNzcXZmZmonnz5uLkyZOZrt2qVSsxY8aMbGPTVXKjECKb3mR5LDk5GWZmZtiyZQs6deqkLh8+fDjOnTuHQ4cOZTqmUaNGqFWrFubPn68u27FjB3x8fJCQkPDeKjVAapaysrJCbGxstlWFRESA1PkzIiICrq6uWXY0Jf0TEhKC0aNH49KlS1wNXscuXbqE5s2b49q1a9l27H7X/zltvr9l+80plUq4u7sjNDRUozw0NDTLzm2A1Fb49v45bSskIiJ6H29vbwwcOFCvlpQoKB4+fIi1a9e+c8Sarsg6WsrPzw89e/aEh4cH6tWrh+XLl+Pu3bvqeWvGjx+PBw8eYO3atQCAQYMGYeHChfDz88OAAQNw4sQJrFq1Chs3bpTzZRARkR4ZPny43CHopbcHBOUlWZObLl26ICYmBlOmTEFkZCSqVauGkJAQODs7A5Am/nlzvL+rqytCQkIwcuRILFq0CI6OjliwYEGBGAZOREREBYNsfW7kwj43RJRT7HNDlL8KfZ8bIqLCooj9DUgkG139X2NyQ0SUjYyBCnk9VTwRSTJmZ9Z2cdW3yb5wJhFRQWVoaIjixYvj8ePHAAAzM7NcrbFERO+Xnp6OJ0+ewMzMDEZGH5aeMLkhInoHe3t7AFAnOESUdwwMDFC2bNkP/iOCyQ0R0TsoFAo4ODjA1tY2y0UdiUh3lEqlTiZPZHJDRJQDhoaGH9wPgIjyBzsUExERkV5hckNERER6hckNERER6ZUi1+cmY4KguLg4mSMhIiKinMr43s7JRH9FLrmJj48HAJQpU0bmSIiIiEhb8fHx711ZvMitLZWeno6HDx/CwsJC55NxxcXFoUyZMrh37x7XrcpDvM/5g/c5f/A+5x/e6/yRV/dZCIH4+Hg4Ojq+d7h4kau5MTAwgJOTU55ew9LSkv9x8gHvc/7gfc4fvM/5h/c6f+TFfX5fjU0GdigmIiIivcLkhoiIiPQKkxsdUqlU8Pf3h0qlkjsUvcb7nD94n/MH73P+4b3OHwXhPhe5DsVERESk31hzQ0RERHqFyQ0RERHpFSY3REREpFeY3BAREZFeYXKjpcWLF8PV1RUmJiZwd3fHkSNH3rn/oUOH4O7uDhMTE5QrVw5Lly7Np0gLN23u8/bt29GyZUuUKlUKlpaWqFevHvbu3ZuP0RZe2r6fMxw7dgxGRkaoWbNm3gaoJ7S9z0lJSZgwYQKcnZ2hUqlQvnx5rF69Op+iLby0vc/r16/Hxx9/DDMzMzg4OMDX1xcxMTH5FG3hdPjwYXTo0AGOjo5QKBTYuXPne4+R5XtQUI5t2rRJGBsbixUrVogrV66I4cOHC3Nzc3Hnzp0s979165YwMzMTw4cPF1euXBErVqwQxsbGYuvWrfkceeGi7X0ePny4+Pnnn8WpU6fEtWvXxPjx44WxsbE4e/ZsPkdeuGh7nzM8f/5clCtXTrRq1Up8/PHH+RNsIZab+9yxY0fh6ekpQkNDRUREhPjnn3/EsWPH8jHqwkfb+3zkyBFhYGAg5s+fL27duiWOHDkiqlatKj777LN8jrxwCQkJERMmTBDbtm0TAMSOHTveub9c34NMbrRQp04dMWjQII2ySpUqiXHjxmW5/5gxY0SlSpU0ygYOHCjq1q2bZzHqA23vc1aqVKkiJk+erOvQ9Epu73OXLl3EDz/8IPz9/Znc5IC29/nPP/8UVlZWIiYmJj/C0xva3ufZs2eLcuXKaZQtWLBAODk55VmM+iYnyY1c34Nslsqh5ORkhIWFoVWrVhrlrVq1wvHjx7M85sSJE5n2b926Nc6cOYOUlJQ8i7Uwy819flt6ejri4+NhbW2dFyHqhdze56CgINy8eRP+/v55HaJeyM193rVrFzw8PDBr1iyULl0abm5uGD16NF69epUfIRdKubnPXl5euH//PkJCQiCEwKNHj7B161a0a9cuP0IuMuT6HixyC2fmVnR0NNLS0mBnZ6dRbmdnh6ioqCyPiYqKynL/1NRUREdHw8HBIc/iLaxyc5/fNnfuXLx8+RI+Pj55EaJeyM19vn79OsaNG4cjR47AyIgfHTmRm/t869YtHD16FCYmJtixYweio6MxZMgQPH36lP1uspGb++zl5YX169ejS5cuSExMRGpqKjp27IhffvklP0IuMuT6HmTNjZYUCoXGthAiU9n79s+qnDRpe58zbNy4EZMmTUJwcDBsbW3zKjy9kdP7nJaWhu7du2Py5Mlwc3PLr/D0hjbv5/T0dCgUCqxfvx516tSBt7c3AgICsGbNGtbevIc29/nKlSsYNmwYJk6ciLCwMOzZswcREREYNGhQfoRapMjxPcg/v3KoZMmSMDQ0zPRXwOPHjzNlpRns7e2z3N/IyAg2NjZ5Fmthlpv7nCE4OBj9+vXDli1b0KJFi7wMs9DT9j7Hx8fjzJkzCA8PxzfffANA+hIWQsDIyAh//fUXmjVrli+xFya5eT87ODigdOnSsLKyUpdVrlwZQgjcv38fFSpUyNOYC6Pc3OcZM2agfv36+O677wAANWrUgLm5ORo2bIipU6eyZl1H5PoeZM1NDimVSri7uyM0NFSjPDQ0FF5eXlkeU69evUz7//XXX/Dw8ICxsXGexVqY5eY+A1KNTZ8+fbBhwwa2meeAtvfZ0tISFy9exLlz59SPQYMGoWLFijh37hw8PT3zK/RCJTfv5/r16+Phw4d48eKFuuzatWswMDCAk5NTnsZbWOXmPickJMDAQPMr0NDQEMDrmgX6cLJ9D+Zpd2U9kzHUcNWqVeLKlStixIgRwtzcXNy+fVsIIcS4ceNEz5491ftnDIEbOXKkuHLlili1ahWHgueAtvd5w4YNwsjISCxatEhERkaqH8+fP5frJRQK2t7nt3G0VM5oe5/j4+OFk5OT6Ny5s7h8+bI4dOiQqFChgujfv79cL6FQ0PY+BwUFCSMjI7F48WJx8+ZNcfToUeHh4SHq1Kkj10soFOLj40V4eLgIDw8XAERAQIAIDw9XD7kvKN+DTG60tGjRIuHs7CyUSqWoXbu2OHTokPq53r17i8aNG2vsf/DgQVGrVi2hVCqFi4uLWLJkST5HXDhpc58bN24sAGR69O7dO/8DL2S0fT+/iclNzml7n69evSpatGghTE1NhZOTk/Dz8xMJCQn5HHXho+19XrBggahSpYowNTUVDg4OokePHuL+/fv5HHXhcuDAgXd+3haU70GFEKx/IyIiIv3BPjdERESkV5jcEBERkV5hckNERER6hckNERER6RUmN0RERKRXmNwQERGRXmFyQ0RERHqFyQ0RaVizZg2KFy8udxi55uLigsDAwHfuM2nSJNSsWTNf4iGi/MfkhkgP9enTBwqFItPjxo0bcoeGNWvWaMTk4OAAHx8fRERE6OT8p0+fxtdff63eVigU2Llzp8Y+o0ePxr59+3Ryvey8/Trt7OzQoUMHXL58WevzFOZkk0gOTG6I9FSbNm0QGRmp8XB1dZU7LADSQpyRkZF4+PAhNmzYgHPnzqFjx45IS0v74HOXKlUKZmZm79ynWLFieboicYY3X+cff/yBly9fol27dkhOTs7zaxMVZUxuiPSUSqWCvb29xsPQ0BABAQGoXr06zM3NUaZMGQwZMkRjBeq3nT9/Hk2bNoWFhQUsLS3h7u6OM2fOqJ8/fvw4GjVqBFNTU5QpUwbDhg3Dy5cv3xmbQqGAvb09HBwc0LRpU/j7++PSpUvqmqUlS5agfPnyUCqVqFixItatW6dx/KRJk1C2bFmoVCo4Ojpi2LBh6ufebJZycXEBAHTq1AkKhUK9/Waz1N69e2FiYoLnz59rXGPYsGFo3Lixzl6nh4cHRo4ciTt37uC///5T7/Ou38fBgwfh6+uL2NhYdQ3QpEmTAADJyckYM2YMSpcuDXNzc3h6euLgwYPvjIeoqGByQ1TEGBgYYMGCBbh06RJ+/fVX7N+/H2PGjMl2/x49esDJyQmnT59GWFgYxo0bB2NjYwDAxYsX0bp1a3z++ee4cOECgoODcfToUXzzzTdaxWRqagoASElJwY4dOzB8+HCMGjUKly5dwsCBA+Hr64sDBw4AALZu3Yp58+Zh2bJluH79Onbu3Inq1atned7Tp08DAIKCghAZGaneflOLFi1QvHhxbNu2TV2WlpaGzZs3o0ePHjp7nc+fP8eGDRsAQH3/gHf/Pry8vBAYGKiuAYqMjMTo0aMBAL6+vjh27Bg2bdqECxcu4Msvv0SbNm1w/fr1HMdEpLfyfGlOIsp3vXv3FoaGhsLc3Fz96Ny5c5b7bt68WdjY2Ki3g4KChJWVlXrbwsJCrFmzJstje/bsKb7++muNsiNHjggDAwPx6tWrLI95+/z37t0TdevWFU5OTiIpKUl4eXmJAQMGaBzz5ZdfCm9vbyGEEHPnzhVubm4iOTk5y/M7OzuLefPmqbcBiB07dmjs8/aK5sOGDRPNmjVTb+/du1colUrx9OnTD3qdAIS5ubkwMzNTr57csWPHLPfP8L7fhxBC3LhxQygUCvHgwQON8ubNm4vx48e/8/xERYGRvKkVEeWVpk2bYsmSJeptc3NzAMCBAwcwffp0XLlyBXFxcUhNTUViYiJevnyp3udNfn5+6N+/P9atW4cWLVrgyy+/RPny5QEAYWFhuHHjBtavX6/eXwiB9PR0REREoHLlylnGFhsbi2LFikEIgYSEBNSuXRvbt2+HUqnE1atXNToEA0D9+vUxf/58AMCXX36JwMBAlCtXDm3atIG3tzc6dOgAI6Pcf5z16NED9erVw8OHD+Ho6Ij169fD29sbJUqU+KDXaWFhgbNnzyI1NRWHDh3C7NmzsXTpUo19tP19AMDZs2chhICbm5tGeVJSUr70JSIq6JjcEOkpc3NzfPTRRxpld+7cgbe3NwYNGoSffvoJ1tbWOHr0KPr164eUlJQszzNp0iR0794df/zxB/7880/4+/tj06ZN6NSpE9LT0zFw4ECNPi8ZypYtm21sGV/6BgYGsLOzy/QlrlAoNLaFEOqyMmXK4L///kNoaCj+/vtvDBkyBLNnz8ahQ4c0mnu0UadOHZQvXx6bNm3C4MGDsWPHDgQFBamfz+3rNDAwUP8OKlWqhKioKHTp0gWHDx8GkLvfR0Y8hoaGCAsLg6GhocZzxYoV0+q1E+kjJjdERciZM2eQmpqKuXPnwsBA6nK3efPm9x7n5uYGNzc3jBw5Et26dUNQUBA6deqE2rVr4/Lly5mSqPd580v/bZUrV8bRo0fRq1cvddnx48c1akdMTU3RsWNHdOzYEUOHDkWlSpVw8eJF1K5dO9P5jI2NczQKq3v37li/fj2cnJxgYGCAdu3aqZ/L7et828iRIxEQEIAdO3agU6dOOfp9KJXKTPHXqlULaWlpePz4MRo2bPhBMRHpI3YoJipCypcvj9TUVPzyyy+4desW1q1bl6mZ5E2vXr3CN998g4MHD+LOnTs4duwYTp8+rU40xo4dixMnTmDo0KE4d+4crl+/jl27duHbb7/NdYzfffcd1qxZg6VLl+L69esICAjA9u3b1R1p16xZg1WrVuHSpUvq12BqagpnZ+csz+fi4oJ9+/YhKioKz549y/a6PXr0wNmzZzFt2jR07twZJiYm6ud09TotLS3Rv39/+Pv7QwiRo9+Hi4sLXrx4gX379iE6OhoJCQlwc3NDjx490KtXL2zfvh0RERE4ffo0fv75Z4SEhGgVE5FekrPDDxHljd69e4tPP/00y+cCAgKEg4ODMDU1Fa1btxZr164VAMSzZ8+EEJodWJOSkkTXrl1FmTJlhFKpFI6OjuKbb77R6ER76tQp0bJlS1GsWDFhbm4uatSoIaZNm5ZtbFl1kH3b4sWLRbly5YSxsbFwc3MTa9euVT+3Y8cO4enpKSwtLYW5ubmoW7eu+Pvvv9XPv92heNeuXeKjjz4SRkZGwtnZWQiRuUNxhk8++UQAEPv378/0nK5e5507d4SRkZEIDg4WQrz/9yGEEIMGDRI2NjYCgPD39xdCCJGcnCwmTpwoXFxchLGxsbC3txedOnUSFy5cyDYmoqJCIYQQ8qZXRERERLrDZikiIiLSK0xuiIiISK8wuSEiIiK9wuSGiIiI9AqTGyIiItIrTG6IiIhIrzC5ISIiIr3C5IaIiIj0CpMbIiIi0itMboiIiEivMLkhIiIivcLkhoiIiPTK/wHIbVYNzhInJAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#四种模型评估\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = lr.predict(X_test)\n",
    "y_test_prob = lr.predict_proba(X_test)\n",
    "\n",
    "print('分类评估汇总报告:\\n',classification_report(y_test,y_test_pred))\n",
    "print('误分类矩阵:\\n',confusion_matrix(y_test,y_test_pred))                \n",
    "\n",
    "fpr, tpr, thresholds =roc_curve(y_test, y_test_prob[:,1])\n",
    "auc = auc(fpr, tpr)\n",
    "print('AUC值:',auc)\n",
    "\n",
    "# 画ROC曲线\n",
    "plt.plot(fpr, tpr, lw=2, label='ROC curve (area = {:.2f})'.format(auc))\n",
    "plt.plot([0,1], [0, 1], 'r--')\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.ylabel('True Positive Rate')\n",
    "plt.title('Receiver operating characteristic example')\n",
    "plt.legend(loc='lower right')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "41ec8483-f077-4051-aa3a-5e30415bd9cc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#画一个更美观的误分类矩阵\n",
    "def show_confusion_matrix(cnf_matrix, class_labels):\n",
    "    plt.matshow(cnf_matrix, cmap=plt.cm.YlGn, alpha=0.7)\n",
    "    ax = plt.gca()\n",
    "    ax.set_xlabel('Predicted Label', fontsize=16)\n",
    "    ax.set_xticks(range(0,len(class_labels)))\n",
    "    ax.set_xticklabels(class_labels,rotation=45)\n",
    "    ax.set_ylabel('Actual Label', fontsize=16, rotation=90)\n",
    "    ax.set_yticks(range(0,len(class_labels)))\n",
    "    ax.set_yticklabels(class_labels)\n",
    "    ax.xaxis.set_label_position('top')\n",
    "    ax.xaxis.tick_top()\n",
    "\n",
    "    for row in range(len(cnf_matrix)):\n",
    "        for col in range(len(cnf_matrix[row])):\n",
    "            ax.text(col, row, cnf_matrix[row][col], va='center', ha='center', fontsize=16)\n",
    "\n",
    "class_labels = [0,1]\n",
    "\n",
    "cnf_matrix = confusion_matrix(y_test, y_test_pred) \n",
    "show_confusion_matrix(cnf_matrix, class_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "66e2995a-e927-41eb-baac-1190f62ffe62",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
